现在我还是一个小蒟蒻,所以有关代码解释的,以后再说,你就只要知道有这个操作就好……具体请见yybdalao的博客
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define N 500010
#define in inline
struct node{
int data,cnt,size;
int son[2],f;
}t[N];
int root,tot;
in void pushup(int u){
t[u].size=t[u].cnt+t[t[u].son[0]].size+t[t[u].son[1]].size;
}
in void rotate(int x){
int y=t[x].f;
int z=t[y].f;
int k=(t[y].son[1]==x);
t[z].son[t[z].son[1]==y]=x;
t[x].f=z;
t[y].son[k]=t[x].son[k^1];
t[t[x].son[k^1]].f=y;
t[x].son[k^1]=y;
t[y].f=x;
pushup(y);pushup(x);
}
in void splay(int x,int g){
while(t[x].f!=g){
int y=t[x].f;
int z=t[y].f;
if(z!=g)
(t[y].son[0]==x)^(t[z].son[0]==y)?rotate(x):rotate(y);
rotate(x);
}
if(g==0)root=x;
}
in void insert(int x){
int u=root,ff=0;
while(u && t[u].data!=x){
ff=u;
u=t[u].son[x>t[u].data];
}
if(u)t[u].cnt++;
else{
u=++tot;
if(ff)
t[ff].son[x>t[ff].data]=u;
t[u].son[0]=t[u].son[1]=0;
t[u].f=ff;
t[u].data=x;
t[u].cnt=1;
t[u].size=1;
}
splay(u,0);
}
in void find(int x){
int u=root;
if(!u)return;
while(t[u].son[x>t[u].data] && x!=t[u].data)
u=t[u].son[x>t[u].data];
splay(u,0);
}
in int Next(int x,int f){
find(x);
int u=root;
if(t[u].data>x && f)return u;
if(t[u].data<x && !f)return u;
u=t[u].son[f];
while(t[u].son[f^1])u=t[u].son[f^1];
return u;
}
in void Delete(int x){
int last=Next(x,0);
int nxt=Next(x,1);
splay(last,0);splay(nxt,last);
int del=t[nxt].son[0];
if(t[del].cnt>1){t[del].cnt--;splay(del,0);}
else t[nxt].son[0]=0;
}
in int kth(int x){
int u=root;
if(t[u].size<x)return 0;
while(1){
int y=t[u].son[0];
if(x>t[u].cnt+t[y].size){
x-=t[u].cnt+t[y].size;
u=t[u].son[1];
}
else
if(t[y].size>=x)u=y;
else return t[u].data;
}
}
int main(){
int i,j,k,n,m;
insert(+2147483647);
insert(-2147483647);//保证查前驱和后继不会RE且有数可查...
scanf("%d",&n);
for(i=1;i<=n;i++){
int num,x;
scanf("%d%d",&num,&x);
if(num==1)insert(x);
if(num==2)Delete(x);
if(num==3){
find(x);
printf("%d\n",t[t[root].son[0]].size);
}
if(num==4){
printf("%d\n",kth(x+1));
}
if(num==5)
printf("%d\n",t[Next(x,0)].data);
if(num==6)
printf("%d\n",t[Next(x,1)].data);
}
return 0;
}