1 struct Splay{ 2 int rt,sz; ///根节点,树节点总数 3 int va[N],son[N][2],fa[N];///值,左右儿子,父亲 4 void spin(int t){ ///旋转操作 5 int x=fa[t], f=fa[x], y=son[x][1]==t; 6 son[x][y]=son[t][y^1], fa[son[x][y]]=x; 7 son[t][y^1]=x, fa[x]=t, fa[t]=f; 8 if(f) son[f][son[f][1]==x]=t; 9 } 10 void play(int x){ /// splay操作 11 for(int i;i=fa[x];spin(x)) 12 if(fa[i]) 13 spin((x==son[i][0])==(i==son[fa[i]][0])?i:x); 14 rt=x; 15 } 16 void ins(int v){///插入元素 17 int y,x=rt; 18 while(1){ 19 y=son[x][va[x]<v]; 20 if(!y){ 21 y=++sz, va[y]=v, fa[y]=x; 22 son[y][0]=son[y][1]=0; 23 son[x][va[x]<v]=y; 24 break; 25 } 26 x=y; 27 }play(y); 28 } 29 int suc(){ ///找后继 30 int x=rt,y=son[x][1]; 31 while(son[y][0])y=son[y][0]; 32 return va[y]; 33 } 34 int pre(){ ///找前驱 35 int x=rt,y=son[x][0]; 36 while(son[y][1])y=son[y][1]; 37 return va[y]; 38 } 39 void init(int x){ ///初始化,需要初始值 40 sz=rt=1;va[rt]=x; 41 fa[1]=son[1][0]=son[1][1]=0; 42 } 43 }splay;