#include <bits/stdc++.h>
using namespace std;
int cnt=1;
struct Node
{
int left;
int right;
int value;
int num;
int size;
};
Node t[10010];
int fun1(int x,int root)
{
if(root==0) return 1;
if(x<t[root].value)
return fun1(x,t[root].left);
else if(x==t[root].value)
return t[t[root].left].size;
else if(x>t[root].value)
return t[t[root].left].size+t[root].num+fun1(x,t[root].right);
}
int fun2(int x,int root)
{
if(x<=t[t[root].left].size)
return fun2(x,t[root].left);
else if(x<=t[t[root].left].size+t[root].num)
return t[root].value;
else
return fun2(x-t[t[root].left].size-t[root].num,t[root].right);
}
void insert(int x,int root)
{
if(cnt==1)
{
Node temp={0,0,x,1,1};
t[cnt]=temp;
cnt++;
}
else
{
if(x<t[root].value)
{
if(t[root].left==0)
{
Node temp={0,0,x,1,1};
t[cnt]=temp;
t[root].left=cnt;
cnt++;
}
else
insert(x,t[root].left);
}
if(x==t[root].value)
t[root].num++;
if(x>t[root].value)
{
if(t[root].right==0)
{
Node temp={0,0,x,1,1};
t[cnt]=temp;
t[root].right=cnt;
cnt++;
}
else
insert(x,t[root].right);
}
}
t[root].size=t[t[root].left].size+t[t[root].right].size+t[root].num;
}
int main()
{
int n,op,x;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>op>>x;
if(op==1) cout<<fun1(x,1)<<endl;
if(op==2) cout<<fun2(x,1)<<endl;
if(op==3)
{
int temp=fun1(x,1);
if(temp==1) cout<<-2147483647<<endl;
else cout<<fun2(temp-1,1)<<endl;
}
if(op==4)
{
int temp=fun1(x+1,1);
if(temp==cnt) cout<<2147483647<<endl;
else cout<<fun2(temp,1)<<endl;
}
if(op==5) insert(x,1);
}
return 0;
}