#include<iostream>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
int val=0;
int l=0;
int r=0;
int cnt=0;
int siz=0;
}a[10002];
int q,Nsum;
int preNode(int x,int val,int ans=(-2147483647))
{
if(a[x].val>=val)
{
if(a[x].l)
return preNode(a[x].l,val,ans);
else
return ans;
}
else
{
if(a[x].r)
{
if(a[x].cnt)
return preNode(a[x].r,val,a[x].val);
else
return preNode(a[x].r,val,ans);
}
else
return a[x].val;
}
}
int aftNode(int x,int val,int ans=2147483647)
{
if(a[x].val<=val)
{
if(a[x].r)
return aftNode(a[x].r,val,ans);
else
return ans;
}
else
{
if(a[x].l)
{
if(a[x].cnt)
return aftNode(a[x].l,val,a[x].val);
else
return aftNode(a[x].l,val,ans);
}
else
return a[x].val;
}
}
int rank_val(int x,int rk)
{
if(!x)
return 0;
int res=a[x].cnt;
if(a[x].l)
{
if(a[a[x].l].siz>rk)
return rank_val(a[x].l,rk);
else
res+=a[a[x].l].siz;
}
if(res>=rk || !a[x].r)
return a[x].val;
else
return rank_val(a[x].r,rk-res);
}
int _rank(int x,int val)
{
if(!x)
return 0;
if(a[x].val==val)
{
if(a[x].l)
return a[a[x].l].siz;
else
return 0;
}
else if(a[x].val>val)
{
if(a[x].l)
return _rank(a[x].l,val);
else
return 0;
}
else
{
int res=a[x].cnt;
if(a[x].l)
res+=a[a[x].l].siz;
if(a[x].r)
res+=_rank(a[x].r,val);
return res;
}
}
void add(int x,int val)
{
a[x].siz++;
if(a[x].val==val)
a[x].cnt++;
else if(a[x].val<val)
{
if(a[x].r)
add(a[x].r,val);
else
{
Nsum++;
a[Nsum].val=val;
a[Nsum].cnt=1;
a[Nsum].siz=1;
a[x].r=Nsum;
}
}
else
{
if(a[x].l)
add(a[x].l,val);
else
{
Nsum++;
a[Nsum].val=val;
a[Nsum].cnt=1;
a[Nsum].siz=1;
a[x].l=Nsum;
}
}
}
int main()
{
cin>>q;
int op,x;
for(int i=0;i<q;i++)
{
cin>>op>>x;
switch(op)
{
case 1:
cout<<_rank(1,x)+1<<endl;
break;
case 2:
if(x>Nsum)
cout<<0x7fffffff<<endl;
else
cout<<rank_val(1,x)<<endl;
break;
case 3:
cout<<preNode(1,x)<<endl;
break;
case 4:
cout<<aftNode(1,x)<<endl;
break;
case 5:
if(!Nsum)
{
Nsum++;
a[Nsum].val=x;
a[Nsum].cnt=1;
a[Nsum].siz=1;
}
else
add(1,x);
break;
default:
break;
}
}
return 0;
}