#include<bits/stdc++.h>
inline void read(int &a)
{
a=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')
{
a=(a<<1)+(a<<3)+c-'0';
c=getchar();
}
}
inline void write(int a)
{
if(a<0){a=-a;putchar('-');}
if(a>9)write(a/10);
putchar(a%10+'0');
}
const int maxn=300001;
int nodenum=0,root=0;
struct node
{
int order,num,sum;
int son[2];
inline int comp(int x)
{
if(x==num)return -1;
if(x<num)return 0;
return 1;
}
inline bool operator>(const node&a)
{
if(order>a.order)return true;
return false;
}
}p[maxn];
inline void newnode(int x)
{
p[++nodenum].num=x;
p[nodenum].son[0]=p[nodenum].son[1]=0;
p[nodenum].order=rand()*rand();
p[nodenum].sum=1;
}
inline void update(int k)
{
p[k].sum=p[p[k].son[0]].sum+p[p[k].son[1]].sum+1;
}
inline void rotate(int &k,int d)
{
int t=p[k].son[d];
p[k].son[d]=p[t].son[d^1];
p[t].son[d^1]=k;
update(k);update(t);
k=t;
}
inline void insert(int &k,int x)
{
if(!k)
{
newnode(x);
k=nodenum;
}
else
{
int d=p[k].comp(x);
if(d==-1)d=0;
insert(p[k].son[d],x);
if(p[p[k].son[d]]>p[k])rotate(k,d);
else update(k);
}
}
inline void remove(int &k,int x)
{
int d=p[k].comp(x),t;
if(d==-1)
{
if(!(p[k].son[0])&&!(p[k].son[1]))
{
k=0;
return ;
}
if(!(p[k].son[0]*p[k].son[1]))
{
t=p[k].son[0]+p[k].son[1];
k=t;
update(k);
return ;
}
else
{
if(p[p[k].son[0]]>p[p[k].son[1]])t=0;
else t=1;
rotate(k,t);
remove(p[k].son[t],x);
update(k);
return ;
}
}
else
{
remove(p[k].son[d],x);
update(k);
return ;
}
}
inline int query(int k,int x,int has)
{
if(p[p[k].son[0]].sum+1+has==x)return p[k].num;
if(p[p[k].son[0]].sum+1+has>x)return query(p[k].son[0],x,has);
else return query(p[k].son[1],x,has+p[p[k].son[0] ].sum+1);
}
int main()
{
srand(time(NULL));
p[0].num=p[0].order=-INT_MAX;p[0].sum=0;
int m,opt,x;
read(m);
while(m--)
{
read(opt);read(x);
if(opt==1)insert(root,x);
if(opt==2)remove(root,x);
if(opt==3){write(query(root,x,0));printf("\n");}
}
return 0;
}