LOJ〹104 BZOJ P 224普通バランスツリー【Splayボード】


#include

const int N=1e5+5;
int n,rt,tot,fa[N],ch[N][2],val[N],cnt[N],sz[N];

struct Splay {
    void maintain(int x) {
        sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+cnt[x];
    }

    bool get(int x) {
        return x==ch[fa[x]][1];
    }

    void clear(int x) {
        ch[x][0]=ch[x][1]=fa[x]=val[x]=sz[x]=cnt[x]=0;
    }

    void rotate(int x) {
        int y=fa[x],z=fa[y],chk=get(x);
        ch[y][chk]=ch[x][chk^1]; fa[ch[x][chk^1]]=y; ch[x][chk^1]=y;
        fa[y]=x; fa[x]=z;
        if(z) ch[z][y==ch[z][1]]=x;
        maintain(x); maintain(y);
    }

    void splay(int x) {
        for(int f=fa[x];f=fa[x],f;rotate(x))
            if(fa[f]) rotate(get(x)==get(f)?f:x);
        rt=x;
    }

    void ins(int k) {
        if(!rt) {
            val[++tot]=k;
            cnt[tot]++;
            rt=tot;
            maintain(rt);
            return;
        }
        int cnr=rt,f=0;
        while(1) {
            if(val[cnr]==k) {
                cnt[cnr]++;
                maintain(cnr); maintain(f);
                splay(cnr);
                break;
            }
            f=cnr;
            cnr=ch[cnr][val[cnr]if(!cnr) {
                val[++tot]=k;
                cnt[tot]++;
                fa[tot]=f;
                ch[f][val[f]break;
            }
        }
    }

    int rk(int k) {
        int res=0,cnr=rt;
        while(1) {
            if(k0];
            } else {
                res+=sz[ch[cnr][0]];
                if(k==val[cnr]) {
                    splay(cnr);
                    return res+1;
                }
                res+=cnt[cnr];
                cnr=ch[cnr][1];
            }
        }
    }

    int kth(int k) {
        int cnr=rt;
        while(1) {
            if(ch[cnr][0]&&k<=sz[ch[cnr][0]]) {
                cnr=ch[cnr][0];
            } else {
                k-=cnt[cnr]+sz[ch[cnr][0]];
                if(k<=0) return val[cnr];
                cnr=ch[cnr][1];
            }
        }
    }

    int pre() {
        int cnr=ch[rt][0];
        while(ch[cnr][1]) cnr=ch[cnr][1];
        return cnr;
    }

    int nxt() {
        int cnr=ch[rt][1];
        while(ch[cnr][0]) cnr=ch[cnr][0];
        return cnr;
    }

    void del(int k) {
        rk(k);
        if(cnt[rt]>1) {cnt[rt]--;maintain(rt);return;}
        if(!ch[rt][0]&&!ch[rt][1]) {clear(rt);rt=0;return;}
        if(!ch[rt][0]) {int cnr=rt;rt=ch[rt][1];fa[rt]=0;clear(cnr);return;}
        if(!ch[rt][1]) {int cnr=rt;rt=ch[rt][0];fa[rt]=0;clear(cnr);return;}
        int x=pre(),cnr=rt;
        splay(x);
        fa[ch[cnr][1]]=x;
        ch[x][1]=ch[cnr][1];
        clear(cnr);
        maintain(rt);
    }
}Tree;

int main() {
    scanf("%d",&n);

    while(n--) {
        int type,x;
        scanf("%d%d",&type,&x);
        if(type==1) Tree.ins(x);
        else if(type==2) Tree.del(x);
        else if(type==3) printf("%d
"
,Tree.rk(x)); else if(type==4) printf("%d
"
,Tree.kth(x)); else if(type==5) Tree.ins(x),printf("%d
"
,val[Tree.pre()]),Tree.del(x); else Tree.ins(x),printf("%d
"
,val[Tree.nxt()]),Tree.del(x); } return 0; }