10 if(root==
nullptr)
return 0;
15 void insert(T x,
int t=1) { root=insert(root,x,Log-1,t); }
21 root=erase(root,x,Log-1,t);
25 void apply_xor(T x) {
if(root!=
nullptr) root->lazy^=x; }
28 T
max() {
return get_min(root,~0,Log-1); }
31 T
min() {
return get_min(root,0,Log-1); }
36 return get(root,k,Log-1);
44 if(root==
nullptr)
return 0;
46 for(
int i=Log-1; i>=0; i--) {
49 if(v==
nullptr)
return 0;
62 next[0]=next[1]=
nullptr;
68 void evaluate(Node*v,
int bit) {
69 if((v->lazy>>bit)&1) swap(v->next[0],v->next[1]);
70 if(v->next[0]!=
nullptr) v->next[0]->lazy^=v->lazy;
71 if(v->next[1]!=
nullptr) v->next[1]->lazy^=v->lazy;
75 Node*insert(Node*v, T x,
int bit,
int cnt) {
76 if(v==
nullptr) v=
new Node;
81 v->next[lr]=insert(v->next[lr],x,bit-1,cnt);
85 Node*erase(Node*v, T x,
int bit,
int cnt) {
88 if(v->size==0)
return nullptr;
92 v->next[lr]=erase(v->next[lr],x,bit-1,cnt);
96 T get_min(Node*v, T x,
int bit) {
100 if(v->next[lr]==
nullptr) lr=1-lr;
101 return get_min(v->next[lr],x,bit-1)|((T)lr<<bit);
104 T get(Node*v,
int k,
int bit) {
107 int m=(v->next[0]!=
nullptr ? v->next[0]->size : 0);
108 if(k<m)
return get(v->next[0],k,bit-1);
109 else return get(v->next[1],k-m,bit-1)|((T)1<<bit);
112 int count_lower(Node*v,T x,
int bit) {
113 if(v==
nullptr||bit<0)
return 0;
116 int ret=(lr&&v->next[0]!=
nullptr ? v->next[0]->size : 0);
117 return ret+count_lower(v->next[lr],x,bit-1);