#include<bits/stdc++.h>
using namespace std;
struct node{
int val;
int rnd;
int l,r;
int siz;
}tree[1000005];
int tot;
void pushup(int p){
tree[p].siz=tree[tree[p].l].siz+tree[tree[p].r].siz+1;
}
void split(int p,int &l,int &r,int val){
if(!p){
l=0,r=0;
return;
}
if(tree[p].val<=val){
l=p;
split(tree[p].r,tree[p].r,r,val);
pushup(p);
}else{
r=p;
split(tree[p].l,l,tree[p].l,val);
pushup(p);
}
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(tree[x].rnd>tree[y].rnd){
tree[x].r=merge(tree[x].r,y);
pushup(x);
return x;
}else{
tree[y].l=merge(x,tree[y].l);
pushup(y);
return y;
}
}
int newx(int x){
tot++;
tree[tot].val=x;
tree[tot].rnd=rand();
tree[tot].siz=1;
tree[tot].l=tree[tot].r=0;
return tot;
}
int root;
void insert(int v){
int x=0,y=0,z=0;
split(root,x,y,tree[v].val);
root=merge(merge(x,v),y);
}
void erase(int v){
int x=0,y=0,z=0;
split(root,x,y,v);
split(root,x,z,v-1);
z=merge(tree[z].l,tree[z].r);
root=merge(merge(x,z),y);
}
int askp(int v){
int x=0,y=0,z=0;
split(root,x,y,v-1);
int ans=tree[x].siz+1;
root=merge(x,y);
return ans;
}
int asks(int p,int v){
if(tree[tree[p].l].siz+1==v){
return tree[p].val;
}
if(tree[tree[p].l].siz>=v){
return asks(tree[p].l,v);
}else{
return asks(tree[p].r,v-tree[tree[p].l].siz-1);
}
}
int pre(int v){
int x=0,y=0;
split(root,x,y,v-1);
int ans=asks(x,tree[x].siz);
root=merge(x,y);
return ans;
}
int aft(int v){
int x=0,y=0;
split(root,x,y,v);
//cout<<y<<endl;
int ans=asks(y,1);
root=merge(x,y);
return ans;
}
int n;
int op,val;
int main(){
srand(time(0));
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
cin>>n;
while(n--){
cin>>op>>val;
if(op==1){
int p=newx(val);
insert(p);
}else if(op==2){
erase(val);
}else if(op==3){
cout<<askp(val)<<"\n";
}else if(op==4){
cout<<asks(root,val)<<"\n";
}else if(op==5){
cout<<pre(val)<<"\n";
}else{
cout<<aft(val)<<"\n";
}
}
return 0;
}