#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 2147483647
struct BST{
ll lc,rc;
ll val,cnt;
ll size;
};
BST t[1000001];
ll tot,root;
ll add(ll val){
tot++;
t[tot].val=val;
t[tot].size=1;
t[tot].cnt=1;
return tot;
}
void update(ll x){
t[x].size=t[t[x].lc].size+t[t[x].rc].size+t[x].cnt;
}
void build(){
t[++tot].val=-inf;
t[++tot].val=inf;
root=1;
t[root].rc=2;
update(root);
}
void insert(ll &x,ll val){
if(x==0){
x=add(val);
return;
}
if(val==t[x].val) t[x].cnt++;
if(val<t[x].val) insert(t[x].lc,val);
if(val>t[x].val) insert(t[x].rc,val);
update(x);
}
ll pos_val(ll val){
ll x=root,ans=2;
while(x!=0){
if(val==t[x].val){
if(t[x].rc>0){
x=t[x].rc;
while(t[x].lc>0)
x=t[x].lc;
ans=x;
}
break;
}
if(t[x].val>val&&t[x].val<t[ans].val) ans=x;
if(val<t[x].val) x=t[x].lc;
if(val>t[x].val) x=t[x].rc;
}
return t[ans].val;
}
ll pre_val(ll val){
ll x=root,ans=1;
while(x!=0){
if(val==t[x].val){
if(t[x].lc>0){
x=t[x].lc;
while(t[x].rc>0)
x=t[x].rc;
ans=x;
}
break;
}
if(t[x].val<val&&t[x].val>t[ans].val) ans=x;
if(val<t[x].val) x=t[x].lc;
if(val>t[x].val) x=t[x].rc;
}
return t[ans].val;
}
ll get_val(ll x,ll rank){
if(x==0) return inf;
if(t[t[x].lc].size>=rank) return get_val(t[x].lc,rank);
if(t[t[x].lc].size+t[x].cnt>=rank) return t[x].val;
return get_val(t[x].rc,rank-t[t[x].lc].size-t[x].cnt);
}
ll get_rank(ll x,ll val){
if(x==0) return 1;
if(val==t[x].val) return t[t[x].lc].size+1;
if(val<t[x].val) return get_rank(t[x].lc,val);
return get_rank(t[x].rc,val)+t[t[x].lc].size+t[x].cnt;
}
int main(){
ll q;
cin>>q;
build();
for(ll i=1;i<=q;i++){
ll op,x;
cin>>op>>x;
if(op==5) insert(root,x);
if(op==4) cout<<pos_val(x)<<endl;
if(op==3) cout<<pre_val(x)<<endl;
if(op==2) cout<<get_val(root,x)<<endl;
if(op==1) cout<<get_rank(root,x)<<endl;
}
return 0;
}