#include <bits/stdc++.h>
const int N=1e6+5;
using namespace std;
int n,cnt,root;
struct tree
{
int ls,rs,val,sz,p;
}t[N];
void newnode(int x)
{
t[++cnt].sz=1;
t[cnt].val=x;
t[cnt].p=rand();
}
void update(int u)
{
t[u].sz=t[t[u].ls].sz+t[t[u].rs].sz;
}
void rotate (int &r,int d)
{
int k;
if (d==1)
{
k=t[r].rs;
t[r].rs=t[k].ls;
t[k].ls=r;
}
else
{
k=t[r].ls;
t[r].ls=t[k].rs;
t[k].rs=r;
}
t[k].sz=t[r].sz;
update(r);
r=k;
}
void insert(int &u,int x)
{
if (u==0)
{
newnode(x);
u=cnt;
return ;
}
t[u].sz++;
if (x>=t[u].val) insert(t[u].rs,x);
else insert(t[u].ls,x);
if (t[u].ls!=0&&t[u].p>t[t[u].ls].p) rotate(u,0);
if (t[u].rs!=0&&t[u].p>t[t[u].rs].p) rotate(u,1);
update(u);
}
void delet(int &u,int x)
{
t[u].sz--;
if (t[u].val==x)
{
if (t[u].ls==0&&t[u].rs==0)
{
u=0;
return ;
}
if (t[u].ls==0||t[u].rs==0)
{
u=t[u].ls+t[u].rs;
return ;
}
if (t[t[u].ls].p<t[t[u].rs].p)
{
rotate(u,0);
delet(t[u].rs,x);
return ;
}
else
{
rotate(u,1);
delet(t[u].ls,x);
return ;
}
}
if (t[u].val>=x) delet(t[u].ls,x);
else delet(t[u].rs,x);
update(u);
}
int rk(int u,int x)
{
if (u==0) return 0;
if (x>t[u].val)
{
return t[t[u].ls].sz+rk(t[u].rs,x)+1;
}
return rk(t[u].ls,x);
}
int kth(int u,int k)
{
if (k==t[t[u].ls].sz+1)
{
return t[u].val;
}
if (k>t[t[u].ls].sz+1)
{
return kth(t[u].rs,k-t[t[u].ls].sz-1);
}
else
{
return kth(t[u].ls,k);
}
}
int pre(int u,int x)
{
if (u==0)
{
return -1;
}
if (t[u].val>=x)
{
return pre(t[u].ls,x);
}
if (pre(t[u].rs,x)==-1)
{
return t[u].val;
}
else
{
return pre(t[u].rs,x);
}
}
int nxt(int u,int x)
{
if (u==0)
{
return -1;
}
if (t[u].val<=x)
{
return nxt(t[u].rs,x);
}
if (nxt(t[u].ls,x)==-1)
{
return t[u].val;
}
else
{
return nxt(t[u].ls,x);
}
}
int main()
{
srand(time(NULL));
cin>>n;
for (int i=1;i<=n;i++)
{
int opt,x;
cin>>opt>>x;
if (opt==1)
{
insert(root,x);
}
if (opt==2)
{
delet(root,x);
}
if (opt==3)
{
cout<<rk(root,x)+1<<"\n";
}
if (opt==4)
{
cout<<kth(root,x)<<"\n";
}
if (opt==5)
{
cout<<pre(root,x)<<"\n";
}
if (opt==6)
{
cout<<nxt(root,x)<<"\n";
}
}
return 0;
}