#include<bits/stdc++.h>
using namespace std;
#define big 30
#define d (int(1e7+10))
struct node{
node *s[2];
int siz;
node(){
siz=0;
s[0]=s[1]=NULL;
}
};
struct trie{
node *root;
trie(){
root=new node;
}
inline void insert(int x){
node *p=root;
for(int i=big;i>=0;i--){
bool now=(x & (1<<i));
if(p->s[now]==NULL)
p->s[now]=new node;
p->siz++;
p=p->s[now];
}
p->siz++;
}
inline void erase(int x){
node *p=root,*nxt;
for(int i=big;i>=0;i--){
bool now=(x & (1<<i));
nxt=p->s[now];
p->siz--;
if(nxt->siz==1)
p->s[now]=NULL;
if(p->siz==0)
free(p);
p=nxt;
}
p->siz--;
}
inline int ranks(int x){
int rk=0;
node *p=root;
for(int i=big;i>=0;i--){
bool now=(x & (1<<i));
if(now==1 && p->s[0]!=NULL)
rk+=p->s[0]->siz;
if(p->s[now]!=NULL)
p=p->s[now];
else
break;
}
return ++rk;
}
inline int get(int x){
int num=0;
node *p=root;
for(int i=big;i>=0;i--){
if (p->s[0]==NULL)
p=p->s[1],num=num<<1|1;
else if(p->s[1]==NULL || p->s[0]->siz>=x)
p=p->s[0],num=num<<1;
else
x-=p->s[0]->siz,p=p->s[1],num=num<<1|1;
}
return num;
}
inline int pre_find(int x){
int num=0,fdx=0;
node *p=root,*lst;
for(int i=big;i>=0;i--){
bool now=(x & (1<<i));
if (now==1 && p->s[0]!=NULL)
lst=p->s[0],num=fdx<< 1;
if (p->s[now])
p=p->s[now];
else
break;
fdx=fdx<<1|now;
}
while(lst)
if (lst->s[1])
lst=lst->s[1],num=num<<1|1;
else
lst=lst->s[0],num=num<<1;
return num>>1;
}
inline int next_find(int x){
int num=0,fdx=0;
node *p=root,*lst;
for(int i=big;i>=0;i--){
bool now=(x & (1<<i));
if (now==0 && p->s[1]!=NULL)
lst=p->s[1],num=fdx<<1|1;
if (p->s[now])
p=p->s[now];
else
break;
fdx=fdx<<1|now;
}
while(lst)
if (lst->s[0])
lst=lst->s[0],num=num<<1;
else
lst=lst->s[1],num=num<<1|1;
return num>>1;
}
};
trie t;
int main() {
int q;
cin>>q;
while(q--){
int opt,x;
cin>>opt>>x;
if(opt==1)
t.insert(x+d);
if(opt==2)
t.erase(x+d);
if(opt==3)
cout<<t.ranks(x+d)<<"\n";
if(opt==4)
cout<<t.get(x)-d<<"\n";
if(opt==5)
cout<<t.pre_find(x+d)-d<<"\n";
if(opt==6)
cout<<t.next_find(x+d)-d<<"\n";
}
return 0;
}