阅读背景:

各种板子[自用]

来源:互联网 

手动开O(2)

#pragma G++ optimize(2)

Splay

#include<bits/stdc++.h>
#define il inline
#define rg register
#define lol long long
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)

using namespace std;

const int N=1e5+10;
const int inf=2e9;

void in(int &ans)
{
    ans=0; int f=1; char i=getchar();
    while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
    while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0', i=getchar();
    ans*=f;
}

int n,root,tot;

struct Splay {
    int f,size,ch[2],val,cnt;
}t[N];

il bool get(int x) {
    return t[t[x].f].ch[1]==x;
}

il void up(int x) {
    t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}

void rotate(int x) {
    int f=t[x].f,gf=t[f].f;
    int k1=get(x),k2=get(f);
    t[f].ch[k1]=t[x].ch[k1^1], t[t[x].ch[k1^1]].f=f;
    t[gf].ch[k2]=x, t[x].f=gf;
    t[f].f=x, t[x].ch[k1^1]=f;
    up(f); up(x);
}

void splay(int x,int goal) {
    while(t[x].f!=goal) {
        int f=t[x].f,gf=t[f].f;
        if(gf!=goal)
            (get(x)^get(f))?rotate(x):rotate(f);
        rotate(x);
    }
    if(!goal) root=x;
}

void insert(int v) {
    int u=root,f=0;
    while(u && t[u].val!=v) {
        f=u;
        u=t[u].ch[v>t[u].val];
    }
    if(u) t[u].cnt++;
    else {
        u=++tot;
        if(f) t[f].ch[v>t[f].val]=u;
        t[u].cnt=t[u].size=1;
        t[u].ch[0]=t[u].ch[1]=0;
        t[u].val=v,t[u].f=f;
    }
    splay(u,0);
}

void find(int x) {
    int u=root; if(!u) return;
    while(t[u].ch[x>t[u].val] && x!=t[u].val)
        u=t[u].ch[x>t[u].val];
    splay(u,0);
}

int kth(int k) {
    int u=root; if(t[u].size<k) return 0;
    while(1) {
        int y=t[u].ch[0];
        if(k>t[y].size+t[u].cnt) {
            k-=t[y].size+t[u].cnt;
            u=t[u].ch[1];
        }
        else if(k<=t[y].size) u=y;
        else return t[u].val;
    }
}

int Rank(int x) {
    find(x); int u=root;
    return t[t[u].ch[0]].size;
}

int Get(int x,int f) {
    find(x); int u=root;
    if(t[u].val>x && f) return u;
    if(t[u].val<x && !f) return u;
    u=t[u].ch[f];
    while(t[u].ch[f^1]) u=t[u].ch[f^1];
    return u;
}

void Del(int x) {
    int last=Get(x,0),nex=Get(x,1);
    splay(last,0); splay(nex,last);
    int u=t[nex].ch[0];
    if(t[u].cnt>1) {
        t[u].cnt--;
        splay(u,0);
    }
    else t[nex].ch[0]=0;
}

int main()
{
    in(n); insert(inf); insert(-inf);
    for(rg int i=1;i<=n;i++) {
        int op,x;
        in(op),in(x);
        if(op==1) insert(x);
        if(op==2) Del(x);
        if(op==3) printf("%d\n",Rank(x));
        if(op==4) printf("%d\n",kth(x+1));
        if(op==5) printf("%d\n",t[Get(x,0)].val);
        if(op==6) printf("%d\n",t[Get(x,1)].val);
    }
    return 0;
}#includ



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: