#include<iostream>
using namespace std;
int q,op,x,tr=1,m;
#define MAXN 10010
struct tree{
int left,right,ans,size,value;
}a[MAXN];
void insert(int z,int root){
if(tr==1){
a[tr].value=z;
a[tr].left=0;
a[tr].right=0;
a[tr].ans=1;
a[tr].size=0;
}else{
if(a[root].value==z){
a[root].ans++;
}else{
a[root].size++;
if(z<a[root].value){
if(a[root].left==0){
a[root].left=tr;
a[tr].value=z;
a[tr].left=0;
a[tr].right=0;
a[tr].ans=1;
a[tr].size=0;
}else{
insert(z,a[root].left);
}
}
if(z>a[root].value){
if(a[root].right==0){
a[root].right=tr;
a[tr].value=z;
a[tr].left=0;
a[tr].right=0;
a[tr].ans=1;
a[tr].size=0;
}else{
insert(z,a[root].right);
}
}
}
}
}
int checkx(int num,int root){
if(x==a[root].value){
return num;
}else if(x<a[root].value){
checkx(num,a[root].left);
}else{
checkx(num+a[a[root].left].size+a[root].ans,a[root].right);
}
}
int xcheck(int z,int root){
if(z>=a[a[root].left].size+1 && z<=a[a[root].left].size+a[root].ans){
return a[root].value;
}else if(z<a[a[root].left].size){
xcheck(z,a[root].left);
}else{
xcheck(z-a[a[root].left].size-a[root].ans,a[root].right);
}
}
int main(){
cin>>q;
for(int i=0;i<q;i++){
cin>>op>>x;
switch(op){
case 1:
cout<<checkx(1,1)<<endl;
break;
case 2:
cout<<xcheck(x,1)<<endl;
break;
case 3:
cout<<xcheck(checkx(1,1)-1,1)<<endl;
break;
case 4:
cout<<xcheck(checkx(1,1)+1,1)<<endl;
break;
case 5:
insert(x,1);
tr++;
break;
}
}
return 0;
}