#include<bits/stdc++.h>
using namespace std;
#define L tr[u].l
#define R tr[u].r
const int N=1e5+5,INF=1e8;
struct Node{
int l,r;
int key,val;
int cnt,size;
}tr[N];
int root,idx;
void pushup(int u)
{
tr[u].size=tr[L].size+tr[R].size+tr[u].cnt;
}
int getNode(int key)
{
tr[++idx].key=key;
tr[idx].val=rand();
tr[idx].cnt=tr[idx].size=1;
return idx;
}
void zig(int &u)
{
int q=L;
tr[u].l=tr[q].r,tr[q].r=u;
u=q;
pushup(R);
pushup(u);
}
void zag(int &u)
{
int q=R;
R=tr[q].l,tr[q].l=u;
u=q;
pushup(L);
pushup(u);
}
void insert(int &u,int key)
{
if(!u) u=getNode(key);
else if(tr[u].key==key) tr[u].cnt++;
else if(tr[u].key>key)
{
insert(L,key);
if(tr[L].val>tr[u].val) zig(u);
}
else
{
insert(R,key);
if(tr[R].val>tr[u].val) zag(u);
}
pushup(u);
}
void remove(int &u,int key)
{
if(!u) return;
if(tr[u].key==key)
{
if(tr[u].cnt>1) tr[u].cnt--;
else if(L||R)
{
if(!R||tr[L].val>tr[R].val)
{
zig(u);
remove(R,key);
}
else
{
zag(u);
remove(L,key);
}
}
else u=0;
}
else if(tr[u].key>key) remove(L,key);
else remove(R,key);
if(u) pushup(u);
}
int kth(int &u,int key)
{
if(!u) return 0;
if(tr[u].key==key) return tr[L].size+1;
if(tr[u].key>key) return kth(L,key);
return tr[L].size+tr[u].cnt+kth(R,key);
}
int find(int &u,int rank)
{
if(!u) return INF;
if(tr[L].size>=rank) return find(L,rank);
if(tr[L].size+tr[u].cnt>=rank) return tr[u].key;
return find(R,rank-tr[L].size-tr[u].cnt);
}
int getPrev(int u,int key)
{
if(!u) return -INF;
if(tr[u].key>=key) return getPrev(L,key);
return max(tr[u].key,getPrev(R,key));
}
int getNext(int u,int key)
{
if(!u)
return INF;
if(tr[u].key<=key)
return getNext(R,key);
return min(tr[u].key,getNext(L,key));
}
int main()
{
srand(time(0));
int n;
scanf("%d",&n);
while(n--)
{
int op,x;
scanf("%d %d",&op,&x);
if(op==1) insert(root,x);
else if(op==2) remove(root,x);
else if(op==3) printf("%d\n",kth(root,x));
else if(op==4) printf("%d\n",find(root,x));
else if(op==5) printf("%d\n",getPrev(root,x));
else printf("%d\n",getNext(root,x));
}
return 0;
}