#include <bits/stdc++.h>
#define int long long
#define maxm 2000005
#define maxn 1005
#define inf 0x3f3f3f3f
using namespace std;
mt19937 rnd(time(0));
int t,n,m,cnt,root;
int a[maxm];
struct node{
int key,sz;
int rk;
int l,r;
}tree[maxm];
void Update(int x){
tree[x].sz=tree[tree[x].l].sz+tree[tree[x].r].sz+1;
}
int New(int x){
cnt++;
tree[cnt]=(node){x,1,rand(),0,0};
return cnt;
}
void Split(int now,int x,int &L,int &R){
if(!tree[now].key){
L=R=0;
return;
}
if(tree[now].key<=x){
L=now;
Split(tree[now].r,x,tree[now].r,R);
}
else{
R=now;
Split(tree[now].l,x,L,tree[now].l);
}
Update(now);
return ;
}
int Merge(int x,int y){
if(!x||!y)return x+y;
if(tree[x].rk>tree[y].rk){
tree[x].r=Merge(tree[x].r,y);
Update(x);
return x;
}
else{
tree[y].l=Merge(x,tree[y].l);
Update(y);
return y;
}
}
void Insert(int x){
int a,b;
Split(root,x,a,b);
root=Merge(Merge(a,New(x)),b);
}
void Erase(int x){
int a,b,c;
Split(root,x,a,c);
Split(a,x-1,a,b);
b=Merge(tree[b].l,tree[b].r);
root=Merge(Merge(a,b),c);
}
void Rank(int x){
int a,b;
Split(root,x-1,a,b);
cout<<tree[a].sz+1<<"\n";
root=Merge(a,b);
}
int Kth(int now,int x){
int rt=now;
while(!rt){
if(tree[tree[rt].l].sz+1==x)break;
else if(x<=tree[tree[rt].l].sz)rt=tree[rt].l;
else{
x-=(tree[tree[rt].l].sz+1);
rt=tree[rt].r;
}
}
return rt;
}
void Pre(int x){
int a,b;
Split(root,x-1,a,b);
cout<<tree[Kth(a,tree[a].sz)].key<<"\n";
root=Merge(a,b);
}
void Nxt(int x){
int a,b;
Split(root,x,a,b);
cout<<tree[Kth(b,1)].key<<"\n";
root=Merge(a,b);
}
signed main(){
cin>>t;
while(t--){
int op,z;
cin>>op>>z;
if(op==1)Insert(z);
if(op==2)Erase(z);
if(op==3)Rank(z);
if(op==4)cout<<tree[Kth(root,z)].key<<"\n";
if(op==5)Pre(z);
if(op==6)Nxt(z);
}
return 0;
}