注意问题:1、如果某个指针移动了,要判断好与其他语句的先后关系
2、习惯于打初始化
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100009;
int T;
int nn,root;
int fa[maxn],ch[maxn][2],siz[maxn],cnt[maxn],ky[maxn];
int Splayinit(){
nn=root=0;
fa[0]=ch[0][0]=ch[0][1]=siz[0]=cnt[0]=ky[0]=0;
}
inline int son(int x){
return (ch[fa[x]][1]==x);
}
inline int pushup(int x){
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+cnt[x];
}
int Rotate(int x){
int y=fa[x];
int z=fa[y];
int b=son(x),c=son(y);
int a=ch[x][b^1];
if(z)ch[z][c]=x;
else root=x;
fa[x]=z;
if(a)fa[a]=y;
ch[y][b]=a;
fa[y]=x;ch[x][b^1]=y;
pushup(y);pushup(x);
}
int Splay(int x,int i){
while(fa[x]!=i){
int y=fa[x];
int z=fa[y];
if(z==i){
Rotate(x);
}else{
if(son(x)==son(y)){
Rotate(y);Rotate(x);
}else{
Rotate(x);Rotate(x);
}
}
}
}
int Getp(int val){
int x=root;
while(x){
if(ky[x]==val){
Splay(x,0);return 0;
}
if(val>ky[x])x=ch[x][1];
else x=ch[x][0];
}
}
int Getpre(int val){
int x=root,ret=0;
while(x){
if(ky[x]>=val){
x=ch[x][0];
}else{
ret=ky[x];
x=ch[x][1];
}
}
return ret;
}
int Getsuf(int val){
int x=root,ret=0;
while(x){
if(ky[x]<=val){
x=ch[x][1];
}else{
ret=ky[x];
x=ch[x][0];
}
}
return ret;
}
int Insert(int val){
int x=root,y=0;
while(x){
y=x;
if(ky[x]==val){
++cnt[x];++siz[x];
Splay(x,0);return 0;
}
if(val>ky[x])x=ch[x][1];
else x=ch[x][0];
}
x=(++nn);
fa[x]=y;ch[x][0]=ch[x][1]=0;
siz[x]=cnt[x]=1;ky[x]=val;
if(y==0){
root=x;
}else{
if(val>ky[y])ch[y][1]=x;
else ch[y][0]=x;
}
Splay(x,0);
}
int Del(int val){
Getp(val);
int x=root;
if(cnt[x]>1){
--cnt[x];--siz[x];return 0;
}
if((ch[x][0]==0)&&(ch[x][1]==0)){
root=0;
}else if(ch[x][0]==0){
root=ch[x][1];fa[ch[x][1]]=0;
}else if(ch[x][1]==0){
root=ch[x][0];fa[ch[x][0]]=0;
}else{
int p=ch[x][0];
while(ch[p][1])p=ch[p][1];
Splay(p,x);
ch[p][1]=ch[x][1];fa[ch[x][1]]=p;
root=p;fa[p]=0;pushup(p);
}
}
int Rank(int val){
Insert(val);
int ret=siz[ch[root][0]]+1;
Del(val);
return ret;
}
int Kth(int k){
int x=root;
for(int l;;){
l=ch[x][0];
if(k<=siz[l]){
x=ch[x][0];
}else if(k>siz[l]+cnt[x]){
k-=(siz[l]+cnt[x]);
x=ch[x][1];
}else{
return ky[x];
}
}
}
int main(){
scanf("%d",&T);
while(T--){
int opty,x;
scanf("%d%d",&opty,&x);
if(opty==1)Insert(x);
if(opty==2)Del(x);
if(opty==3)printf("%d\n",Rank(x));
if(opty==4)printf("%d\n",Kth(x));
if(opty==5)printf("%d\n",Getpre(x));
if(opty==6)printf("%d\n",Getsuf(x));
}
return 0;
}