#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+3,inf=0x3f3f3f3f;
struct node{
int l,r,val,pri,cnt,siz;
}t[maxn];
int n,k,x,y,ans,root,tot,op;
void zig(int &k){
int y=t[k].l;
t[k].l=t[y].r;
t[y].r=k;
t[k].siz=t[t[k].l].siz+t[t[k].r].siz+t[k].cnt;
t[y].siz=t[t[y].l].siz+t[t[y].r].siz+t[y].cnt;
k=y;
}
void zag(int &k){
int y=t[k].r;
t[k].r=t[y].l;
t[y].l=k;
t[k].siz=t[t[k].l].siz+t[t[k].r].siz+t[k].cnt;
t[y].siz=t[t[y].l].siz+t[t[y].r].siz+t[y].cnt;
k=y;
}
void Insert(int &k,int &p){
if(!k){
k=++tot;t[k].val=p;t[k].pri=rand();
t[k].cnt=t[k].siz=1;
t[k].l=t[k].r=0;
return;
}
else ++t[k].siz;
if(t[k].val==p) ++t[k].cnt;
else if(t[k].val>p){
Insert(t[k].l,p);
if(t[t[k].l].pri<t[k].pri) zig(k);
}
else{
Insert(t[k].r,p);
if(t[t[k].r].pri<t[k].pri) zag(k);
}
return;
}
void Delete(int &k,int &p){
if(t[k].val==p){
if(t[k].cnt>1) t[k].cnt--,t[k].siz--;
else if(!t[k].l||!t[k].r) k=t[k].l+t[k].r;
else if(t[t[k].l].pri<t[t[k].r].pri) zig(k),Delete(k,p);
else zag(k),Delete(k,p);
return;
}
t[k].siz--;
if(p<t[k].val) Delete(t[k].l,p);
else Delete(t[k].r,p);
return;
}
int QueryPre(int &p){
int x=root,res=-inf;
while(x){
if(t[x].val<=p) res=t[x].val,x=t[x].r;
else x=t[x].l;
}
return res;
}
int QuerySuc(int &p){
int x=root,res=inf;
while(x){
if(t[x].val>=p) res=t[x].val,x=t[x].l;
else x=t[x].r;
}
return res;
}
int QueryKth(int &k){
int x=root;
while(x){
if(t[t[x].l].siz<k&&t[t[x].l].siz+t[x].cnt>=k) return t[x].val;
if(t[t[x].l].siz>=k) x=t[x].l;
else k-=(t[t[x].l].siz+t[x].cnt),x=t[x].r;
}
return -1;
}
int QueryRank(int &p){
int x=root,res=0;
while(x){
if(t[x].val==p) return res+t[t[k].l].siz+1;
if(p<t[x].val) x=t[x].l;
else res+=t[t[x].l].siz+t[x].cnt,x=t[x].r;
}
return res;
}
int main(){
srand(time(NULL));
cin >> n;
while(n--){
cin >> op >> x;
if(op==1) Insert(root,x);
else if(op==2) Delete(root,x);
else if(op==3) cout << QueryRank(x) << endl;
else if(op==4) cout << QueryKth(x) << endl;
else if(op==5) cout << QueryPre(x) << endl;
else if(op==6) cout << QuerySuc(x) << endl;
}
return 0;
}