#include<iostream>
#include<map>
using namespace std;
struct tree{
int value,lt,rt,si;
};
tree inTree[10000+1];
int tot=0;
map<int,bool> dp;
void insert(int x,int pos){
inTree[pos].si++;
if(tot==0){
inTree[++tot].value=x;
return;
}
if(x<inTree[pos].value){
if(!inTree[pos].lt){
inTree[pos].lt=++tot;
inTree[tot].value=x;
inTree[tot].si=1;
return;
}else{
insert(x,inTree[pos].lt);
}
}else{
if(!inTree[pos].rt){
inTree[pos].rt=++tot;
inTree[tot].value=x;
inTree[tot].si=1;
return;
}else{
insert(x,inTree[pos].rt);
}
}
}
int findRank(int x,int pos){
if(pos==0) return 0;
if(x==inTree[pos].value){
return inTree[inTree[pos].lt].si;
}else if(x<inTree[pos].value){
return findRank(x,inTree[pos].lt);
}else{
return inTree[inTree[pos].lt].si+1+findRank(x,inTree[pos].rt);
}
}
int findNumber(int x,int pos){
if(pos==0) return 0;
if(inTree[inTree[pos].lt].si+1==x){
return inTree[pos].value;
}else if(inTree[inTree[pos].lt].si+1>x){
return findNumber(x,inTree[pos].lt);
}else{
return findNumber(x-inTree[inTree[pos].lt].si-1,inTree[pos].rt);
}
}
int main(){
int q;
cin>>q;
for(int i=1;i<=q;i++){
int op,x;
cin>>op>>x;
int t;
switch(op){
case 1:
cout<<findRank(x,1)+1<<endl;
break;
case 2:
cout<<findNumber(x,1)<<endl;
break;
case 3:
t=findRank(x,1);
t=findNumber(t,1);
if(t) cout<<t<<endl;
else cout<<-2147483647<<endl;
break;
case 4:
if(dp[x]) t=findRank(x,1)+2;
else t=findRank(x,1)+1;
t=findNumber(t,1);
if(t) cout<<t<<endl;
else cout<<2147483647<<endl;
break;
case 5:
dp[x]=1;
insert(x,1);
break;
}
}
return 0;
}