评测记录
#include <stdio.h>
#define il inline
using namespace std;
const int N=100005;
struct tree{
int s[2];
int p;
int v;
int cnt;
int siz;
il void init(int p1,int v1){
p=p1,v=v1;
cnt=siz=1;
}
}t[N];
int root;
int idx=0;
il void pushup(int x){
t[x].siz=t[t[x].s[0]].siz+t[t[x].s[1]].siz+t[x].cnt;
}
il void rotate(int x){
int y=t[x].p,z=t[y].p;
int k=(t[y].s[1]==x);
t[y].s[k]=t[x].s[k^1];
t[t[x].s[k^1]].p=y;
t[x].s[k^1]=y;
t[y].p=x;
t[z].s[t[z].s[1]==y]=x;
t[x].p=z;
pushup(y);
pushup(x);
}
il void splay(int x,int k){
while(t[x].p!=k){
int y=t[x].p,z=t[y].p;
if(z!=k){
if((t[z].s[0]==y)^(t[y].s[0]==x))
rotate(x);
else rotate(y);
}
rotate(x);
}
if(k==0) root=x;
}
il void find(int v){
int x=root;
while(t[x].s[x>t[x].v] && v!=t[x].v){
x=t[x].s[x>t[x].v];
}
splay(x,0);
}
il int get_front(int v){
find(v);
int x=root;
if(t[x].v<v) return x;
x=t[x].s[0];
while(t[x].s[1]) x=t[x].s[1];
splay(x,0);
return x;
}
il int get_back(int v){
find(v);
int x=root;
if(t[x].v>v) return x;
x=t[x].s[1];
while(t[x].s[0]) x=t[x].s[0];
splay(x,0);
return x;
}
il void del(int v){
int front=get_front(v);
int back=get_back(v);
splay(front,0);
splay(back,front);
int deel=t[back].s[0];
if(t[deel].cnt>1){
t[deel].cnt--;
splay(deel,0);
}
else{
t[back].s[0]=0;
splay(back,0);
}
}
il void insert(int v){
int x=root,p=0;
while(x && t[x].v!=v){
p=x;
x=t[x].s[v>t[x].v];
}
if(x) t[x].cnt++;
else{
x=++idx;
t[p].s[v>t[p].v]=x;
t[x].init(p,v);
}
splay(x,0);
}
il int get_rank(int v){
insert(v);
int res=t[t[root].s[0]].siz;
del(v);
return res;
}
il int get_val(int k){
int x=root;
while(1){
int y=t[x].s[0];
if(t[y].siz+t[x].cnt<k){
k-=(t[y].siz+t[x].cnt);
x=t[x].s[1];
}
else{
if(t[y].siz>=k) x=t[x].s[0];
else break;
}
}
splay(x,0);
return t[x].v;
}
int main(){
insert(1e9);
insert(-1e9);
int n;
scanf("%d",&n);
while(n--){
int opt,x;
scanf("%d%d",&opt,&x);
if(opt==1) insert(x);
if(opt==2) del(x);
if(opt==3) printf("%d\n",get_rank(x));
if(opt==4) printf("%d\n",get_val(x+1));
if(opt==5) printf("%d\n",t[get_front(x)].v);
if(opt==6) printf("%d\n",t[get_back(x)].v);
}
}