#include<bits/stdc++.h>
using namespace std;
struct node
{
int f,size,cnt,value,son[2];
}tree[5000001];
#define Getson(x) tree[tree[x].f].son[1]==x
int root,cnt;
void update(int x)
{
tree[x].size=tree[x].cnt;
if(tree[x].son[0]) tree[x].size+=tree[tree[x].son[0]].size;
if(tree[x].son[1]) tree[x].size+=tree[tree[x].son[1]].size;
}
void Print(int);
void rotate(int x)
{
int father=tree[x].f,grand_father=tree[father].f;
bool which=Getson(x);
tree[father].son[which]=tree[x].son[!which];
tree[tree[father].son[which]].f=father;
tree[x].son[!which]=father;
tree[father].f=x;
tree[x].f=grand_father;
if(grand_father)
tree[grand_father].son[tree[grand_father].son[1]==father]=x;
update(father);
update(x);
}
void Splay(int x)
{
for(int fa;fa=tree[x].f;rotate(x))
if(tree[fa].f)
rotate(Getson(x)==Getson(fa)?fa:x);
root=x;
}
void Insert(int x)
{
if(!root)
{
root=++cnt;
tree[cnt].size=tree[cnt].cnt=1;
tree[cnt].f=tree[cnt].son[0]=tree[cnt].son[1]=0;
tree[cnt].value=x;
return;
}
else
{
int now=root,fa=0;
while(now)
{
if(tree[now].value==x)
{
tree[now].cnt++;
update(now);
update(fa);
Splay(now);
return;
}
fa=now,now=tree[now].son[x>tree[now].value];
}
now=tree[fa].son[x>tree[fa].value]=++cnt;
tree[cnt].size=tree[cnt].cnt=1;
tree[cnt].f=fa;
tree[cnt].son[0]=tree[cnt].son[1]=0;
tree[cnt].value=x;
update(fa);
Splay(now);
return;
}
}
void Del(int x)
{
int now=root;
while(now)
{
if(tree[now].value==x)
{
if(tree[now].cnt>1)
{
tree[now].cnt--;
update(now);
return;
}
Splay(now);
int Posi=tree[now].son[0];
if(!Posi)
{
root=tree[now].son[1];
tree[tree[now].son[1]].f=0;
return;
}
while(tree[Posi].son[1])
Posi=tree[Posi].son[1];
Splay(Posi);
root=Posi;
tree[Posi].son[1]=tree[now].son[1];
tree[tree[now].son[1]].f=Posi;
update(Posi);
return;
}
now=tree[now].son[x>tree[now].value];
}
}
int Get_Rank(int x)
{
int now=root,Ans=1;
while(now)
{
if(x<tree[now].value)
now=tree[now].son[0];
else
{
Ans+=tree[tree[now].son[0]].size;
if(tree[now].value==x)
{
Splay(now);
return Ans;
}
Ans+=tree[now].cnt;
now=tree[now].son[1];
}
}
return Ans;
}
int Get_Num(int x)
{
int now=root;
while(now)
{
if(tree[tree[now].son[0]].size>=x)
now=tree[now].son[0];
else
{
int temp=tree[tree[now].son[0]].size+tree[now].cnt;;
if(x<=temp)
return tree[now].value;
x-=temp;
now=tree[now].son[1];
}
}
return -1;
}
int Get_Pre(int x)
{
int now=tree[root].son[0];
while(tree[now].son[1])
now=tree[now].son[1];
return tree[now].value;
}
int Get_Suc(int x)
{
int now=tree[root].son[1];
while(tree[now].son[0])
now=tree[now].son[0];
return tree[now].value;
}
int main()
{
//freopen("22.in","r",stdin);
//freopen("CR.out","w",stdout);
int n,opst,x;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>opst>>x;
switch(opst)
{
case 1:
Insert(x);
break;
case 2:
Del(x);
break;
case 3:
cout<<Get_Rank(x)<<endl;
break;
case 4:
cout<<Get_Num(x)<<endl;
break;
case 5:
Insert(x),cout<<Get_Pre(x)<<endl,Del(x);
break;
case 6:
Insert(x),cout<<Get_Suc(x)<<endl,Del(x);
break;
}
}
}
/*
50
1 577793
1 408221
1 880861
2 408221
1 460353
1 223489
6 577713
4 2
5 889905
2 880861
1 100033
1 73956
1 22575
5 583761
6 571549
1 812645
4 3
1 643621
1 451623
6 14895
1 556691
4 1
1 225789
2 22575
1 632329
3 73956
1 316785
5 101413
4 11
5 639414
6 636353
1 272382
1 434049
2 643621
1 99617
2 577793
1 921581
1 894033
3 223489
1 767367
3 272382
1 642721
1 272033
3 632329
1 737721
1 864513
5 746457
1 877545
1 51097
1 484817
*/
/*
999
1 1888000
1 999999
1 22
1 23
6 24
5 24
2 22
1 30
3 24
1 26
1 29
1 27
1 24
1 25
1 28
4 3
3 29
5 28
*/
已经把splay忘光力 痛苦地调了一天还是没有调处来