#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int read()
{
int x=0,s=1;char c=getchar();if(c=='-')s*=-1;
while (c<'0'||c>'9'){c=getchar();if(c=='-')s*=-1;}
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*s;
}
struct _01trie{
struct {
int siz,son[2],tail;
}node[3000001];
int tot;
void init(){
memset(node,0,sizeof(node));
tot=1;
}
void update(int u){
int ls=node[u].son[0],rs=node[u].son[1];
node[u].siz=node[ls].siz+node[rs].siz;
}
void ins(int num,int u,int len){
if(len==0){
node[u].tail++;
node[u].siz++;
return;
}
int i=(num>>(len-1))&1;
if(node[u].son[i]==0){
node[u].son[i]=++tot;
}
ins(num,node[u].son[i],len-1);
update(u);
}
void del(int num,int u,int len){
if(len==0){
node[u].tail--;
node[u].siz--;
return;
}
int i=(num>>(len-1))&1;
del(num,node[u].son[i],len-1);
update(u);
}
int rank(int num,int u,int len){
if(u==-1)return 0;
if(len==0){
return 1;
}
int i=(num>>(len-1))&1;
int ans=0;
int ls=node[u].son[0],rs=node[u].son[1];
if(i==1)ans+=node[ls].siz;
ans+=rank(num,node[u].son[i],len-1);
return ans;
}
int kth(int k,int u,int len,int num){
if(len==0)return num;
int ls=node[u].son[0],rs=node[u].son[1];
if(ls&&node[ls].siz>=k)
return kth(k,ls,len-1,num);
else
{
num+=1<<(len-1);
return kth(k-node[ls].siz,rs,len-1,num);
}
}
int suc(int x){
int k=rank(x+1,1,24);
return kth(k,1,24,0);
}
int pre(int x){
int k=rank(x,1,24);
return kth(k-1,1,24,0);
}
}T;
int main(){
int n=read();T.init();
for(int i=1;i<=n;i++){
int c=read(),x=read();
if(c==1)T.ins(x,1,24);
if(c==2)T.del(x,1,24);
if(c==3)printf("%d\n",T.rank(x,1,24));
if(c==4)printf("%d\n",T.kth(x,1,24,0));
if(c==5)printf("%d\n",T.pre(x));
if(c==6)printf("%d\n",T.suc(x));
}
return 0;
}