#include<bits/stdc++.h>
#define ll long long int
using namespace std;
const int N=2e5+7;
struct node{
ll l,r,val,key,size;
}tree[N];
ll id=0,root=0,n;
int newpoint(ll v){
tree[++id].val=v;
tree[id].key=rand();
tree[id].size=1;
return id;
}
void pushup(ll p){
tree[p].size=tree[tree[p].l].size+tree[tree[p].r].size+1;
}
void split(ll p,ll v,ll x,ll y){
if (!p){
x=0,y=0;
return ;
}
if (tree[p].val<=v){
x=p;
split(tree[x].r,v,tree[x].r,y);
}
else{
y=p;
split(tree[y].l,v,x,tree[y].l);
}
pushup(p);
}
int merge(ll x,ll y){
if (!x || !y){
return x+y;
}
if (tree[x].key<tree[y].key){
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;
}
}
void insert(ll v){
ll x,y,z;
split(root,v,x,y);
z=newpoint(v);
root=merge(merge(x,z),y);
}
void del(ll v){
ll x,y,z;
split(root,v,x,z);
split(x,v-1,x,y);
y=merge(tree[y].l,tree[y].r);
root=merge(merge(x,y),z);
}
int getpoint(ll p,ll k){
if (tree[tree[p].l].size>=k){
return getpoint(tree[p].l,k);
}
if (tree[tree[p].l].size+1==k){
return p;
}
return getpoint(tree[p].r,k-tree[tree[p].l].size-1);
}
void getpre(ll v){
ll x,y;
split(root,v-1,x,y);
ll p=getpoint(x,tree[x].size);
cout<<tree[p].val<<endl;
root=merge(x,y);
}
void getsuc(ll v){
ll x,y;
split(root,v,x,y);
ll p=getpoint(y,1);
cout<<tree[p].val<<endl;
root=merge(x,y);
}
void getrank(ll v){
ll x,y;
split(root,v-1,x,y);
cout<<tree[x].size+1<<endl;
root=merge(x,y);
}
void getval(ll k){
ll p=getpoint(root,k);
cout<<tree[p].val<<endl;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++){
ll opt,x;
cin>>opt>>x;
if (opt==1){
insert(x);
}
if (opt==2){
del(x);
}
if (opt==3){
getrank(x);
}
if (opt==4){
getval(x);
}
if (opt==5){
getpre(x);
}
if (opt==6){
getsuc(x);
}
}
return 0;
}