10 if(root==
nullptr)
return 0;
16 root=insert(root,x,Log-1,t);
23 root=erase(root,x,Log-1,t);
28 if(root!=
nullptr) root->lazy^=x;
33 return get_min(root,~0,Log-1);
38 return get_min(root,0,Log-1);
44 return get(root,k,Log-1);
49 return count_lower(root,x,Log-1);
54 if(root==
nullptr)
return 0;
56 for(
int i=Log-1; i>=0; i--) {
59 if(v==
nullptr)
return 0;
72 next[0]=next[1]=
nullptr;
78 void evaluate(Node*v,
int bit) {
79 if((v->lazy>>bit)&1) swap(v->next[0],v->next[1]);
80 if(v->next[0]!=
nullptr) v->next[0]->lazy^=v->lazy;
81 if(v->next[1]!=
nullptr) v->next[1]->lazy^=v->lazy;
85 Node*insert(Node*v, T x,
int bit,
int cnt) {
86 if(v==
nullptr) v=
new Node;
91 v->next[lr]=insert(v->next[lr],x,bit-1,cnt);
95 Node*erase(Node*v, T x,
int bit,
int cnt) {
98 if(v->size==0)
return nullptr;
102 v->next[lr]=erase(v->next[lr],x,bit-1,cnt);
106 T get_min(Node*v, T x,
int bit) {
110 if(v->next[lr]==
nullptr) lr=1-lr;
111 return get_min(v->next[lr],x,bit-1)|((T)lr<<bit);
114 T get(Node*v,
int k,
int bit) {
117 int m=(v->next[0]!=
nullptr ? v->next[0]->size : 0);
118 if(k<m)
return get(v->next[0],k,bit-1);
119 else return get(v->next[1],k-m,bit-1)|((T)1<<bit);
122 int count_lower(Node*v,T x,
int bit) {
123 if(v==
nullptr||bit<0)
return 0;
126 int ret=(lr&&v->next[0]!=
nullptr ? v->next[0]->size : 0);
127 return ret+count_lower(v->next[lr],x,bit-1);