#include<bits/stdc++.h>
using namespace std;
struct node{
int l;
int r;
int num;
int key;
int s;
};
node all[100000];
int root;
int cnt=1;
int nes(int x){//return loc
all[cnt].l=all[cnt].r=0;
all[cnt].s=1;
all[cnt].num=x;
all[cnt].key=rand();
cnt++;
return cnt-1;
}
void update(int loc){
all[loc].s=all[all[loc].l].s+all[all[loc].r].s;
return;
}
void split(int loc,int val,int &x,int &y){//from <=val;x->l's r;y->r's l;also root
if (loc==0){
x=y=0;
return;
}
if (val>=all[loc].num){
x=loc;
split(all[loc].r,val,all[loc].r,y);
}
else{
y=loc;
split(all[loc].l,val,x,all[loc].l);
}
update(loc);
}
int merge(int le,int ri){//le << ri,return root
if (le==0||ri==0)
return le+ri;//l or r
if (all[le].key<all[ri].key){
all[ri].l=merge(le,all[ri].l);
update(ri);
return ri;
}
else{
all[le].r=merge(all[le].r,ri);
update(le);
return le;
}
}
int x,y,z;
void ins(int val){
split(root,val,x,y);
root=merge(merge(x,nes(val)),y);
}
void del(int val){
split(root,val,x,z);
split(x,val,x,y);
y=merge(all[y].l,all[y].r);
root=merge(merge(x,y),z);
return;
}
int askrank(int val){
split(root,val-1,x,y);
int ret=all[x].s;
root=merge(x,y);
return ret;
}
int asknum(int rk){
int f=root;
while (f!=0){
if (all[all[f].l].s+1==rk)
break;
if (all[all[f].l].s+1<rk)
f=all[f].l;
else{
rk-=all[all[f].l].s+1;
f=all[f].r;
}
}
return all[f].num;
}
int bef(int val){
split(root,val-1,x,y);
int f=x;
while (all[f].r!=0){
f=all[f].r;
}
int ret=all[f].num;
root=merge(x,y);
return ret;
}
int aft(int val){
split(root,val,x,y);
int f=y;
while (all[f].l!=0){
f=all[f].l;
}
int ret=all[f].num;
root=merge(x,y);
return ret;
}
int main(){
srand(time(0));
int n;
cin>>n;
for (int i=0;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
switch(a){
case 1:
ins(b);
break;
case 2:
del(b);
break;
case 3:
printf("%d\n",askrank(b));
break;
case 4:
printf("%d\n",asknum(b));
break;
case 5:
printf("%d\n",bef(b));
break;
default:
printf("%d\n",aft(b));
break;
}
}
return 0;
}