struct vertex{
int pre,flag,child[2];
vertex(){
pre=flag=0;
for (int i=0;i<2;i++) child[i]=-1;
}
};
vector<vertex>Trie;
int avail;
void insert(int n){
int cur=0;
Trie[cur].pre++;
for (int i=30;i>=0;i--){
int x=(n>>i)&1;
if (Trie[cur].child[x]==-1){
Trie[cur].child[x]=avail;
if (Trie.size()<=avail) Trie.push_back(vertex());
else Trie[avail]=vertex();
avail++;
}
cur=Trie[cur].child[x];
Trie[cur].pre++;
}
Trie[cur].flag++;
}
int query(int n){
int ans=0;
int cur=0;
for (int i=30;i>=0;i--){
int x=(n>>i)&1;
if (Trie[cur].child[1]==-1){
cur=Trie[cur].child[0];
}
else if (Trie[cur].child[0]==-1){
ans+=(1LL<<i);
cur=Trie[cur].child[1];
}
else{
if (x){
cur=Trie[cur].child[0];
}
else{
ans+=(1LL<<i);
cur=Trie[cur].child[1];
}
}
}
return ans^n;
}
bool remove(int cur,int n,int i){
if (i>=0){
int x=(n>>i)&1;
bool deleted=remove(Trie[cur].child[x],n,i+1);
if (deleted) Trie[cur].child[x]=-1;
}
else Trie[cur].flag--;
if (cur){
Trie[cur].pre--;
if (Trie[cur].pre==0){
Trie[cur]=vertex();
return 1;
}
}
return 0;
}