#include<bits/stdc++.h>
using namespace std;
const int maxn= 100010;
int n,tot,root;
struct Node{
int ch[2],val;
int pri,siz;
}t[maxn<<2];
int New_code(int x){
t[++tot].siz=1;
t[tot].val=x;
t[tot].pri=rand();
return tot;
}
inline void maintain(int x){
t[x].siz=t[t[x].ch[0]].siz+t[t[x].ch[1]].siz+1;
}
void split(int cur,int k,int &x,int &y){
if(!cur)x=y=0;
else{
if(t[cur].val<=k){
x=cur;
split(t[cur].ch[1],k,t[cur].ch[1],y);
}
else{
y=cur;
split(t[cur].ch[0],k,x,t[cur].ch[0]);
}
maintain(cur);
}
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(t[x].pri<t[y].pri){
t[x].ch[1]=merge(t[x].ch[1],y);
maintain(x);
return x;
}
else{
t[y].ch[0]=merge(x,t[y].ch[0]);
maintain(y);
return y;
}
}
inline void insert(int k){
int x,y;
split(root,k,x,y);
root=merge(merge(x,New_code(k)),y);
}
inline void del(int k){
int x,y,z;
split(root,k,x,z);
split(root,k-1,x,y);
y=merge(t[y].ch[0],t[y].ch[1]);
root=merge(merge(x,y),z);
}
inline int rnk(int k){
int x,y,ans;
split(root,k-1,x,y);
ans=t[x].siz+1;
root=merge(x,y);
return ans;
}
inline int kth(int cur,int k){
while(1){
if(k<=t[t[cur].ch[0]].siz){
cur=t[cur].ch[0];
}
else{
k-=t[t[cur].ch[0]].siz+1;
if(k<=0)
return cur;
cur=t[cur].ch[1];
}
}
}
inline int pre(int k){
int x,y,ans;
split(root,k-1,x,y);
ans=t[kth(x,t[x].siz)].val;
root=merge(x,y);
return ans;
}
inline int nxt(int k){
int x,y,ans;
split(root,k,x,y);
ans=t[kth(y,1)].val;
root=merge(x,y);
return ans;
}
int main(){
srand(time(0));
cin>>n;
for(int i=1;i<=n;i++){
int opt,x;
cin>>opt>>x;
switch(opt){
case 1:{
insert(x);
break;
}
case 2:{
del(x);
break;
}
case 3:{
cout<<rnk(x)<<endl;
break;
}
case 4:{
cout<<t[kth(root,x)].val<<endl;
break;
}
case 5:{
cout<<pre(x)<<endl;
break;
}
case 6:{
cout<<nxt(x)<<endl;
break;
}
}
}
return 0;
}