#include <bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(0)
#define randinit srand(time(0))
const int maxn=1e5+5,randmax=9999,randmin=1;
void read(int &n)
{
n=0;int f=1;char ch=getchar();
while (ch>='9'||ch<='0')
{
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
n=n*10+ch-48;
ch=getchar();
}
}
struct treap{
int data,val;
int ls,rs;
int size;
}tr[maxn];
int cnt,root;
void up(int p)
{
tr[p].size=tr[tr[p].ls].size+tr[tr[p].rs].size+1;
}
void zag(int &now)
{
int tmp=tr[now].ls;
tr[now].ls=tr[tmp].rs;
tr[tmp].rs=now;
tr[tmp].size=tr[now].size;
up(now);
now=tmp;
}
void zig(int &now)
{
int tmp=tr[now].rs;
tr[now].rs=tr[tmp].ls;
tr[tmp].ls=now;
tr[tmp].size=tr[now].size;
up(now);
now=tmp;
}
void insert(int &now,int data)
{
if(!now)
{
now=++cnt;
tr[now].size=1;
tr[now].data=data;
tr[now].val=rand()%randmax+randmin;
return;
}
tr[now].size++;
if (data>=tr[now].data) insert(tr[now].rs,data);
else insert(tr[now].ls,data);
if (tr[now].ls!=0&&tr[now].val>tr[tr[now].ls].val) zag(now);
if (tr[now].rs!=0&&tr[now].val>tr[tr[now].rs].val) zig(now);
up(now);
}
void erase(int &now,int data)
{
tr[now].size--;
if (tr[now].data==data)
{
if (tr[now].ls==0&&tr[now].rs==0)
{
now=0;return;
}
if (tr[now].ls==0||tr[now].rs==0)
{
now=tr[now].ls+tr[now].rs;return;
}
if(tr[tr[now].ls].val<tr[tr[now].rs].val)
{
zag(now);
erase(tr[now].rs,data);
return;
}
else
{
zig(now);
erase(tr[now].rs,data);
return;
}
}
if (tr[now].data>data) erase(tr[now].ls,data);
else erase(tr[now].rs,data);
}
int paiming(int now,int data)
{
if (now==0)
{
return 0;
}
if (data>tr[now].data) return tr[tr[now].ls].size+1+paiming(tr[now].rs,data);
else return paiming(tr[now].ls,data);
}
int find(int now,int paiming)
{
if (paiming==tr[tr[now].ls].size+1) return tr[now].data;
else if(paiming>tr[tr[now].ls].size+1) return find(tr[now].rs,paiming-tr[tr[now].ls].size-1);
else return find(tr[now].ls,paiming);
}
int query_pre(int now,int data)
{
if (!now) return 0;
if (tr[now].data>=data) return query_pre(tr[now].ls,data);
int tmp=query_pre(tr[now].rs,data);
if (!tmp) return tr[now].data;
else return tmp;
}
int query_suf(int now,int data)
{
if (!now) return 0;
if (tr[now].data<=data) return query_suf(tr[now].rs,data);
int tmp=query_suf(tr[now].ls,data);
if (!tmp) return tr[now].data;
else return tmp;
}
int main() {
io;randinit;
int op,x,n;cin>>n;
for (int i=1;i<=n;i++)
{
cin>>op>>x;
switch(op)
{
case 1:insert(root,x);break;
case 2:erase(root,x);break;
case 3:cout<<paiming(root,x)+1<<endl;break;
case 4:cout<<find(root,x)<<endl;break;
case 5:cout<<query_pre(root,x)<<endl;break;
case 6:cout<<query_suf(root,x)<<endl;break;
default:break;
}
}
return 0;
}