手动开O(2)
#pragma G++ optimize(2) Splay
#include<bits/stdc++.h>
#define il inline
#define rg register
#define lol long long
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std;
const int N=1e5+10;
const int inf=2e9;
void in(int &ans)
{
ans=0; int f=1; char i=getchar();
while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0', i=getchar();
ans*=f;
}
int n,root,tot;
struct Splay {
int f,size,ch[2],val,cnt;
}t[N];
il bool get(int x) {
return t[t[x].f].ch[1]==x;
}
il void up(int x) {
t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}
void rotate(int x) {
int f=t[x].f,gf=t[f].f;
int k1=get(x),k2=get(f);
t[f].ch[k1]=t[x].ch[k1^1], t[t[x].ch[k1^1]].f=f;
t[gf].ch[k2]=x, t[x].f=gf;
t[f].f=x, t[x].ch[k1^1]=f;
up(f); up(x);
}
void splay(int x,int goal) {
while(t[x].f!=goal) {
int f=t[x].f,gf=t[f].f;
if(gf!=goal)
(get(x)^get(f))?rotate(x):rotate(f);
rotate(x);
}
if(!goal) root=x;
}
void insert(int v) {
int u=root,f=0;
while(u && t[u].val!=v) {
f=u;
u=t[u].ch[v>t[u].val];
}
if(u) t[u].cnt++;
else {
u=++tot;
if(f) t[f].ch[v>t[f].val]=u;
t[u].cnt=t[u].size=1;
t[u].ch[0]=t[u].ch[1]=0;
t[u].val=v,t[u].f=f;
}
splay(u,0);
}
void find(int x) {
int u=root; if(!u) return;
while(t[u].ch[x>t[u].val] && x!=t[u].val)
u=t[u].ch[x>t[u].val];
splay(u,0);
}
int kth(int k) {
int u=root; if(t[u].size<k) return 0;
while(1) {
int y=t[u].ch[0];
if(k>t[y].size+t[u].cnt) {
k-=t[y].size+t[u].cnt;
u=t[u].ch[1];
}
else if(k<=t[y].size) u=y;
else return t[u].val;
}
}
int Rank(int x) {
find(x); int u=root;
return t[t[u].ch[0]].size;
}
int Get(int x,int f) {
find(x); int u=root;
if(t[u].val>x && f) return u;
if(t[u].val<x && !f) return u;
u=t[u].ch[f];
while(t[u].ch[f^1]) u=t[u].ch[f^1];
return u;
}
void Del(int x) {
int last=Get(x,0),nex=Get(x,1);
splay(last,0); splay(nex,last);
int u=t[nex].ch[0];
if(t[u].cnt>1) {
t[u].cnt--;
splay(u,0);
}
else t[nex].ch[0]=0;
}
int main()
{
in(n); insert(inf); insert(-inf);
for(rg int i=1;i<=n;i++) {
int op,x;
in(op),in(x);
if(op==1) insert(x);
if(op==2) Del(x);
if(op==3) printf("%d\n",Rank(x));
if(op==4) printf("%d\n",kth(x+1));
if(op==5) printf("%d\n",t[Get(x,0)].val);
if(op==6) printf("%d\n",t[Get(x,1)].val);
}
return 0;
}#includ