const int MAXN=1e5+5;
const double alpha=0.75,beta=0.5;
struct Node{
int ch[2],v,cnt,tot;
bool exist;
void build(int v){
this->v=v;
ch[0]=ch[1]=0;
cnt=tot=1;
exist=true;
}
}node[MAXN];
int pool[MAXN],pos1,temp[MAXN],pos2,root;
void Init(int n){
for(int i=n;i>=1;i--)
pool[++pos1]=i;
}
bool isbad(int pos){return alpha*node[pos].cnt<max(node[node[pos].ch[0]].cnt,node[node[pos].ch[1]].cnt)?true:false;}
bool isbad_2(int pos){return beta*node[pos].tot>node[pos].cnt?true:false;}
void dfs(int pos){
if(!pos)return;
dfs(node[pos].ch[0]);
if(node[pos].exist)temp[++pos2]=pos;
else pool[++pos1]=pos;
dfs(node[pos].ch[1]);
}
void build(int lef,int rig,int &pos){
if(lef>rig) return pos=0,void();
int mid=lef+rig>>1;
pos=temp[mid];
if(lef==rig){
node[pos].ch[0]=node[pos].ch[1]=0;
node[pos].cnt=node[pos].tot=1;
return;
}
build(lef,mid-1,node[pos].ch[0]);
build(mid+1,rig,node[pos].ch[1]);
node[pos].tot=node[pos].cnt=node[node[pos].ch[0]].cnt+node[node[pos].ch[1]].cnt+1;
}
void rebuild(int &pos){
pos2=0;
dfs(pos);
build(1,pos2,pos);
}
void check(int &pos,int x){
if(pos){
if(isbad(pos)||isbad_2(pos))
rebuild(pos);
else if(node[pos].v<x)
check(node[pos].ch[1],x);
else
check(node[pos].ch[0],x);
}
}
int rank(int x){
int pos=root,rk=1;
while(pos){
if(node[pos].v<x){
rk+=node[node[pos].ch[0]].cnt+node[pos].exist;
pos=node[pos].ch[1];
}
else
pos=node[pos].ch[0];
}
return rk;
}
int kth(int rk){
int pos=root;
while(pos){
if(node[node[pos].ch[0]].cnt+1==rk&&node[pos].exist)return node[pos].v;
if(node[node[pos].ch[0]].cnt+node[pos].exist<rk){
rk-=node[node[pos].ch[0]].cnt+node[pos].exist;
pos=node[pos].ch[1];
}
else
pos=node[pos].ch[0];
}
}
void Insert(int &pos,int x){
if(!pos){
pos=pool[pos1--];
node[pos].build(x);
return;
}
node[pos].cnt++;node[pos].tot++;
if(node[pos].v<x)Insert(node[pos].ch[1],x);
else Insert(node[pos].ch[0],x);
}
void Insert(int x){
Insert(root,x);
check(root,x);
}
void Delate(int pos,int rk){
node[pos].cnt--;
if(node[node[pos].ch[0]].cnt+1==rk&&node[pos].exist){
node[pos].exist=false;
return;
}
if(node[node[pos].ch[0]].cnt+node[pos].exist<rk)Delate(node[pos].ch[1],rk-node[node[pos].ch[0]].cnt-node[pos].exist);
else Delate(node[pos].ch[0],rk);
}
void Delate(int x){
Delate(root,rank(x));
check(root,x);
}
int main()
{
int n=read_int(),opt,x;
Init(MAXN-1);
while(n--){
opt=read_int(),x=read_int();
switch(opt){
case 1:
Insert(x);
break;
case 2:
Delate(x);
break;
case 3:
enter(rank(x));
break;
case 4:
enter(kth(x));
break;
case 5:
enter(kth(rank(x)-1));
break;
case 6:
enter(kth(rank(x+1)));
break;
}
}
return 0;
}