#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct Node{
int s[2],v,rnd,size;
}t[maxn];
int n,CNT,root;
int New_node(int x){
CNT++;
t[CNT].s[0]=t[CNT].s[1]=0;
t[CNT].v=x;t[CNT].rnd=rand();
t[CNT].size=1;
return CNT;
}
#define pii pair<int,int>
#define fr first
#define sc second
void pushup(int pos){t[pos].size=t[t[pos].s[0]].size+t[t[pos].s[1]].size+1;}
pii split(int now,int k){
if(!now)return {0,0};
if(t[now].v<=k){
pii tmp=split(t[now].s[1],k);
t[now].s[1]=tmp.fr;
pushup(now);
return {now,tmp.sc};
}
else{
pii tmp=split(t[now].s[0],k);
t[now].s[0]=tmp.sc;
pushup(now);
return {tmp.fr,now};
}
}
int merge(int x,int y){
if(!x||!y)return x^y;
if(t[x].rnd<t[y].rnd){
t[x].s[1]=merge(t[x].s[1],y);
pushup(x);
return x;
}
else{
t[y].s[0]=merge(x,t[y].s[0]);
pushup(y);
return y;
}
}
void insert(int x){
pii ans=split(root,x);
root=merge(ans.fr,merge(New_node(x),ans.sc));
}
void del(int x){
pii a=split(root,x);pii b=split(a.fr,x-1);
root=merge(merge(b.fr,merge(t[b.sc].s[0],t[b.sc].s[1])),a.sc);
}
int rk(int x){
int pos=root,ans=0;
while(t[pos].size){
if(t[pos].v<x){
ans+=t[t[pos].s[0]].size+1;
pos=t[pos].s[1];
}
if(t[pos].v>x)pos=t[pos].s[0];
if(t[pos].v==x){ans+=t[t[pos].s[0]].size+1;return ans;}
}
return ans+1;
}
int find(int k){
int pos=root;
while(t[pos].size){
if(t[t[pos].s[0]].size>=k)pos=t[pos].s[0];
if(t[t[pos].s[0]].size+1==k)return t[pos].v;
if(t[t[pos].s[0]].size+1<k){k-=t[t[pos].s[0]].size+1;pos=t[pos].s[1];}
}
}
int pre(int x){
return find(rk(x)-1);
}
int suf(int x){
int pos=root,ans=0;
while(t[pos].size){
if(t[pos].v>x){
ans+=t[t[pos].s[1]].size+1;
pos=t[pos].s[0];
}
if(t[pos].v<x)pos=t[pos].s[1];
if(t[pos].v==x){break;}
}
return find(t[root].size-ans+1);
}
int main(){
srand(time(0));
cin>>n;
for(int i=1;i<=n;i++){
int opt,x;
cin>>opt>>x;
if(opt==1)insert(x);
if(opt==2)del(x);
if(opt==3)cout<<rk(x)<<endl;
if(opt==4)cout<<find(x)<<endl;
if(opt==5)cout<<pre(x)<<endl;
if(opt==6)cout<<suf(x)<<endl;
}
return 0;
}