splay模板

来源:互联网 发布:苹果5s2g网络怎么改4g 编辑:程序博客网 时间:2024/05/26 09:57
#define fa(i) (T[i].p)#define L(i) (T[i].s[0])#define R(i) (T[i].s[1])#define Key (L(R(root)))#define Loc(i) (T[fa(i)].s[1]==i)#define Sets(a,b,c) {if(a)T[a].s[c]=b;if(b)fa(b)=a;}using namespace std;const int N=101000,INF=0x3f3f3f3f;void read(int &x){x=0;char c=getchar();int f=0;while(c<'0'||c>'9'){c=getchar();if(c=='-')f=1;}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}if(f)x=-x;}int A[N];struct node{int s[2],v,size,mark,Min,rev,p;};struct splay_tree{    node T[N<<1];    int root,tot,n,m;    inline void update(int u){        T[u].size=T[L(u)].size+T[R(u)].size+1;        T[u].Min=min(T[L(u)].Min,T[R(u)].Min);        T[u].Min=min(T[u].v,T[u].Min);    }    void Build(int l,int r,int p,int &i){        if(l>r)return ;        int Mid=(l+r)>>1;        T[i=++tot].p=p,T[i].v=A[Mid],T[i].Min=A[Mid],T[i].size=1;        Build(l,Mid-1,i,L(i)),Build(Mid+1,r,i,R(i));        update(i);    }    inline void Rotate(int x){        int y=fa(x),z=fa(y);        int lx=Loc(x),ly=Loc(y);        Sets(y,T[x].s[!lx],lx);        Sets(z,x,ly);        Sets(x,y,!lx);        update(y);    }        inline void splay(int i,int goal){while(fa(i)!=goal){if (fa(fa(i))!=goal)Rotate(fa(i));Rotate(i);}update(i);if (!goal)root=i;}    inline void pushdown(int i){        if (T[i].mark){            int D=T[i].mark;            if(L(i)){T[L(i)].mark+=D,T[L(i)].v+=D,T[L(i)].Min+=D;}            if(R(i)){T[R(i)].mark+=D,T[R(i)].v+=D,T[R(i)].Min+=D;}                    T[i].mark=0;        }        if(T[i].rev){            if(L(i))T[L(i)].rev^=1;            if(R(i))T[R(i)].rev^=1;            T[i].rev=0;            swap(L(i),R(i));        }    }    int Rank(int kth,int i){    pushdown(i);    if (T[L(i)].size+1==kth)return i;    else if (T[L(i)].size>=kth)return Rank(kth,L(i));    else return Rank(kth-T[L(i)].size-1,R(i));    }    void init(){    read(n);    T[0].Min=T[0].v=A[0]=A[n+1]=INF;    For(i,1,n)read(A[i]);    Build(0,n+1,0,root);    T[Rank(n+2,root)].Min=INF;    read(m);}inline void find(int x,int y){splay(Rank(x,root),0);splay(Rank(y+2,root),root);}inline int Mina(int x,int y){find(x,y);return T[Key].Min;}inline void add(int x,int y,int D){find(x,y);T[Key].mark+=D,T[Key].Min+=D,T[Key].v+=D;update(R(root)),update(root);}inline void insert(int x,int y){find(x+1,x);Key=++tot;T[Key].v=T[Key].Min=y;T[Key].size=1,T[Key].p=R(root);}inline void del(int x){find(x,x);T[Key].p=0,Key=0;update(R(root)),update(root);}inline void reverse(int x,int y){find(x,y),T[Key].rev^=1;}inline void revolve(int x,int y,int D){int Mod=(y-x+1);((D%=Mod)+=Mod)%=Mod;find(y-D+1,y);int tk=Key;Key=0;update(R(root)),update(root);find(x,x-1);Sets(R(root),tk,0);update(R(root)),update(root);}}s;


0 0
原创粉丝点击