#include<bits/stdc++.h>
#define N 100010
using namespace std;
#define getchar() (strto1==strto2&&(strto2=(strto1=fsr)+fread(fsr,1,1<<15,stdin),strto1==strto2)?EOF:*strto1++)
char fsr[1<<15],*strto1=fsr,*strto2=fsr;
inline int read()
{
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s*w;
}
inline void write(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
int n;
struct Balance_Treap_tree
{
#define INF 100000000
struct node
{
int l,r;
int key,v;
int size,cnt;
}tree[N];
int root,idx;
int get_node(int key)
{
idx++;
tree[idx].key=key;
tree[idx].v=rand();
tree[idx].cnt=1;
tree[idx].size=1;
return idx;
}
void pushup(int fa)
{
tree[fa].size=tree[tree[fa].l].size+tree[tree[fa].r].size+tree[fa].cnt;
}
void zig(int &fa)
{
int p=tree[fa].l;
tree[fa].l=tree[p].r;
tree[p].r=fa;
fa=p;
pushup(tree[fa].r);
pushup(fa);
}
void zag(int &fa)
{
int p=tree[fa].r;
tree[fa].r=tree[p].l;
tree[p].l=fa;
fa=p;
pushup(tree[fa].l);
pushup(fa);
}
void build()
{
idx=0,root=1;
get_node(-INF),get_node(INF);
tree[1].r=2;
pushup(root);
if(tree[1].v<tree[2].v)zag(root);
}
void insert(int &fa,int key)
{
if(!fa)fa=get_node(key);
else if(tree[fa].key==key)tree[fa].cnt++;
else if(tree[fa].key>key)
{
insert(tree[fa].l,key);
if(tree[tree[fa].l].v>tree[fa].v)zig(fa);
}
else
{
insert(tree[fa].r,key);
if(tree[tree[fa].r].v>tree[fa].v)zag(fa);
}
pushup(fa);
}
void remove(int &fa,int key)
{
if(!fa)return;
if(tree[fa].key==key)
{
if(tree[fa].cnt>1)tree[fa].cnt--;
else if(tree[fa].l||tree[fa].r)
{
if(!tree[fa].r||tree[tree[fa].l].v>tree[tree[fa].r].v)
zig(fa),remove(tree[fa].r,key);
else
zag(fa),remove(tree[fa].l,key);
}else fa=0;
}
else if(tree[fa].key>key)
remove(tree[fa].l,key);
else
remove(tree[fa].r,key);
pushup(fa);
}
int find_rank(int fa,int key)
{
if(tree[fa].key==fa)return tree[tree[fa].l].size+1;
if(tree[fa].key>key)return find_rank(tree[fa].l,key);
else return tree[tree[fa].l].size+tree[fa].cnt+find_rank(tree[fa].r,key);
}
int find_key(int fa,int rank)
{
if(tree[tree[fa].l].size>=rank)return find_key(tree[fa].l,rank);
if(tree[tree[fa].l].size+tree[fa].cnt>=rank)return tree[fa].key;
else return find_key(tree[fa].r,rank-tree[tree[fa].l].size-tree[fa].cnt);
}
int find_prev(int fa,int x)
{
if(!fa)return -INF;
if(tree[fa].key>=x)return find_prev(tree[fa].l,x);
else return max(tree[fa].key,find_prev(tree[fa].r,x));
}
int find_next(int fa,int x)
{
if(!fa)return INF;
if(tree[fa].key<=fa)return find_next(tree[fa].r,x);
else return min(tree[fa].key,find_next(tree[fa].l,x));
}
}Tree;
signed main()
{
Tree.build();
n=read();
while(n--)
{
int op=read(),x=read();
if(op==1)
Tree.insert(Tree.root,x);
if(op==2)
Tree.remove(Tree.root,x);
if(op==3)
write(Tree.find_rank(Tree.root,x)-1),puts("");
if(op==4)
write(Tree.find_key(Tree.root,x+1)),puts("");
if(op==5)
write(Tree.find_prev(Tree.root,x)),puts("");
if(op==6)
write(Tree.find_next(Tree.root,x)),puts("");
}
return 0;
}
样例过了,但只A了一个点