#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
struct FHQ{
int l,r,size,val,key;// l r 儿子 size 第k大 val 权值 key 随机值
} tr[N];
int idx=0,root;
void pushup(int u)
{
tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;
}
int newnode(int val)
{
tr[++idx].val=val;tr[idx].key=rand();tr[idx].size=1;
return idx;
}
void spilt(int u,int v,int &x,int &y)
{
if(!u) { x=y=0; return; }
if(tr[u].val<=v)
{
x=u;
spilt(tr[x].r,v,tr[x].r,y);
}
else
{
y=u;
spilt(tr[y].l,v,x,tr[y].l);
}
pushup(u);
}
int merge(int x,int y)
{
if(!x||!y)
return x+y;
if(tr[x].key<tr[y].key)
{
tr[x].r=merge(tr[x].r,y);
pushup(x); return x;
}
else
{
tr[y].l=merge(x,tr[y].l);
pushup(y); return y;
}
}
void insert(int val)
{
int x=0,y=0;
spilt(root,val,x,y);
root=merge(merge(x,newnode(val)),y);
}
void deleted(int val)
{
int x=0,y=0,z=0;
spilt(root,val,x,z);
spilt(root,val-1,x,y);
y=merge(tr[y].l,tr[y].r);
root=merge(merge(x,y),z);
}
int get_k(int u,int k)
{
if(k<=tr[tr[u].l].size)
get_k(tr[u].l,k);
else if(k==tr[tr[u].l].size+ 1)
return u;
return get_k(tr[u].r,k-tr[tr[u].l].size-1);
}
int get_pre(int val)
{
int x=0,y=0;
spilt(root,val-1,x,y);
int p=get_k(x,tr[x].size);
int ans=tr[p].val;
root=merge(x,y);
return ans;
}
int get_last(int val)
{
int x=0,y=0;
spilt(root,val,x,y);
int p=get_k(y,1);
int ans=tr[p].val;
root=merge(x,y);
return ans;
}
int get_rank(int val)
{
int x=0,y=0;
spilt(root,val-1,x,y);
int ans=tr[x].size+1;
root=merge(x,y);
return ans;
}
int get_val(int u)
{
int p=get_k(root,u);
return tr[p].val;
}
int main()
{
srand(time(NULL));
int n;
cin >> n;
while (n --)
{
int opt,x;
cin>>opt>>x;
if(opt==1) insert(x);
if(opt==2) deleted(x);
if(opt==3) cout<<get_rank(x)<<endl;
if(opt==4) cout<<get_val(x)<<endl;
if(opt==5) cout<<get_pre(x)<<endl;
if(opt==6) cout<<opt<<get_last(x)<<endl;
}
}