#include<bits/stdc++.h>
using namespace std;
int cnt=0;
const int lim=30;
struct node {
int vis[2];
int val;
int ed;
} tree[3000005];
void insert(int a) {
int now=0,p=lim;
while(p) {
bool x=a&(1<<(p--));
if(!tree[now].vis[x])
tree[now].vis[x]=++cnt;
now=tree[now].vis[x];
tree[now].val++;
}
tree[now].ed=a;
}
void deletes(int a) {
int now=0,p=lim;
while(p) {
bool x=a&(1<<(p--));
if(!tree[now].vis[x])
break;
now=tree[now].vis[x];
tree[now].val--;
}
}
int get_rank(int a) {
int now=0,p=lim,ans=0;
while(p) {
bool x=a&(1<<(p--));
if(x&&tree[now].vis[0])
ans+=tree[tree[now].vis[0]].val;
if(!tree[now].vis[x])
break;
now=tree[now].vis[x];
}
return ans+1;
}
int get_val(int a) {
int now=0,p=lim,ans=0;
while(1) {
if((!tree[now].vis[0])&&(!tree[now].vis[1]))
return tree[now].ed;
if(tree[tree[now].vis[0]].val>=a)
now=tree[now].vis[0];
else {
a-=tree[tree[now].vis[0]].val;
now=tree[now].vis[1];
}
}
}
int main() {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
int opt,num,ans;
scanf("%d%d",&opt,&num);
if(opt==1) {
insert(num);
continue;
}
if(opt==2) {
deletes(num);
continue;
}
if(opt==3) {
ans=get_rank(num);
printf("%d\n",ans);
continue;
}
if(opt==4) {
ans=get_val(num);
printf("%d\n",ans);
continue;
}
if(opt==5) {
ans=get_val(get_rank(num)-1);
printf("%d\n",ans);
continue;
}
if(opt==6) {
ans=get_val(get_rank(num+1));
printf("%d\n",ans);
continue;
}
}
return 0;
}