#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,idx=0;
int x,y,z,root;
int opt;
struct node{
int l,r;
int num;
int size;
int val;
}tr[N];
int new_node(int x){
tr[++idx].num=x;
tr[idx].size=1;
tr[idx].val=rand();
return idx;
}
void pushup(int x){
tr[x].size=1 + tr[tr[x].l].size + tr[tr[x].r].size;
}
void split(int p,int num,int &x,int &y){
if(!p){
x=y=0;
return;
}
if(tr[p].num > x){
y=p;
split(tr[p].l,num,x,tr[p].l);
}
else{
x=p;
split(tr[p].r,num,tr[p].r,y);
}
pushup(p);
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(tr[x].size < tr[y].size){
tr[x].r=merge(tr[x].r,y);
pushup(x);
return x;
}
else{
tr[y].l=merge(x,tr[y].l);
pushup(y);
return y;
}
}
void insert(int num){
split(root,num,x,y);
root=merge( merge(x , new_node(num)) ,y);
}
void del(int num){
split(root,num,x,y);
split(x,num-1,x,z);
z=merge(tr[z].l,tr[z].r);
root=merge(merge(x,z),y);
}
int num_to_rank(int num){
split(root,num-1,x,y);
int ans=tr[x].size+1;
root=merge(x,y);
return ans;
}
int rank_to_num(int p,int rank){
if(tr[tr[p].l].size+1==rank){
return tr[p].num;
}
else if(tr[tr[p].l].size+1 > rank){
return rank_to_num(tr[p].l,rank);
}
else{
return rank_to_num(tr[p].r,rank-tr[tr[p].l].size-1);
}
}
int pre(int num){
split(root,num-1,x,y);
int p=x,ans;
ans=rank_to_num(x,tr[x].size);
root=merge(x,y);
return ans;
}
int after(int num){
split(root,num,x,y);
int p=y,ans;
ans=rank_to_num(y,1);
root=merge(x,y);
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
while(n--){
cin>>opt>>x;
if(opt==1) insert(x);
if(opt==2) del(x);
if(opt==3) cout<<num_to_rank(x)<<endl;
if(opt==4) cout<<rank_to_num(root,x)<<endl;
if(opt==5) cout<<pre(x)<<endl;
if(opt==6) cout<<after(x)<<endl;
}
return 0;
}