#include <bits/stdc++.h>
using namespace std;
const int N=1e5+1,INF=1e9;
int n,op,x,root,tot,son[N][2],val[N],pri[N],siz[N],cnt[N];
int New(int p)
{
val[++tot]=p;
pri[tot]=rand();
siz[tot]=1;
cnt[tot]=1;
return tot;
}
void push_up(int p)
{
siz[p]=siz[son[p][0]]+siz[son[p][0]]+cnt[p];
}
void bulid()
{
root=New(-INF);
son[root][1]=New(INF);
push_up(root);
}
void rotate(int& p,int d)
{
int q=son[p][d^1];
son[p][d^1]=son[q][d];
son[q][d]=p;
p=q;
push_up(son[p][d^1]);
push_up(p);
}
void insert(int& p,int x)
{
if(!p)
{
p=New(x);
return;
}
if(x==val[p]) cnt[p]++;
else
{
int d=(x>val[p])?1:0;
insert(son[p][d],x);
if(pri[son[p][d]]>pri[p]) rotate(p,d^1);
push_up(p);
}
}
void remove(int& p,int x)
{
if(!p) return;
if(x==val[p])
{
if(cnt[p]>1)
{
cnt[p]--;
push_up(p);
return;
}
if(son[p][0]||son[p][1])
{
if(!son[p][1]||pri[son[p][0]]>pri[son[p][1]])
{
rotate(p,1);
remove(son[p][1],x);
}
else
{
rotate(p,0);
remove(son[p][0],x);
}
push_up(p);
}
else p=0;
return;
}
if(x<val[p]) remove(son[p][0],x);
else remove(son[p][1],x);
push_up(p);
}
int get_rank(int id,int x)
{
if(!id) return 1;
if(x==val[id]) return siz[son[id][0]]+1;
if(x<val[id]) return get_rank(son[id][0],x);
return siz[son[id][0]]+cnt[id]+get_rank(son[id][1],x);
}
int get_val(int id,int x)
{
if(!id) return INF;
if(x<=siz[son[id][0]]) return get_val(son[id][0],x);
if(x<=siz[son[id][0]]+cnt[id]) return val[id];
return get_val(son[id][1],x-siz[son[id][0]]-cnt[id]);
}
int get_pre(int id,int x)
{
if(!id) return -INF;
if(val[id]<x) return max(val[id],get_pre(son[id][1],x));
return get_pre(son[id][0],x);
}
int get_next(int id,int x)
{
if(!id) return INF;
if(val[id]>x) return min(val[id],get_next(son[id][0],x));
return get_next(son[id][1],x);
}
int main()
{
bulid();
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
while(n--)
{
cin>>op>>x;
if(op==1) insert(root,x);
if(op==2) remove(root,x);
if(op==3) cout<<get_rank(root,x)-1<<'\n';
if(op==4) cout<<get_val(root,x+1)<<'\n';
if(op==5) cout<<get_pre(root,x)<<'\n';
if(op==6) cout<<get_next(root,x)<<'\n';
}
return 0;
}