[ErkkiErkko的模板]FHQ Treap

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <algorithm>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
const int MAXN=100005;
int n,tot,root=0,ch[MAXN][2],fa[MAXN],val[MAXN];
int dat[MAXN],siz[MAXN],rep[MAXN];
#define lc ch[x][0]
#define rc ch[x][1]
inline void pushup(int x){
    siz[x]=siz[lc]+siz[rc]+1;
}
inline int newnode(int v){
    int x=++tot;
    siz[x]=1;
    val[x]=v;
    dat[x]=rand();
    lc=rc=0;
    return x;
}
int merge(int x,int y){
    if(!x||!y) return x+y;
    if(dat[x]<dat[y]){
        ch[x][1]=merge(ch[x][1],y);
        pushup(x);
        return x;
    }
    else{
        ch[y][0]=merge(x,ch[y][0]);
        pushup(y);
        return y;
    }
}
void split(int now,int& x,int& y,int v){
    if(!now) x=y=0;
    else{
        if(val[now]<=v){
            x=now;
            split(ch[now][1],ch[now][1],y,v);
        }
        else{
            y=now;
            split(ch[now][0],x,ch[now][0],v);
        }
        pushup(now);
    }
}
inline int kth(int top,int k){
    int x=top;
    while(1){
        if(k<=siz[lc]) x=lc;
        else if(k==siz[lc]+1) return x;
        else k-=siz[lc]+1,x=rc;
    }
}
int main(){
    srand((unsigned)time(0));
    n=read();
    int x,y,z;
    for(int i=1;i<=n;i++){
        int opt=read();
        if(opt==1){
            int v=read();
            split(root,x,y,v);
            root=merge(merge(x,newnode(v)),y);
        }
        else if(opt==2){
            int v=read();
            split(root,x,z,v);
            split(x,x,y,v-1);
            y=merge(ch[y][0],ch[y][1]);
            root=merge(merge(x,y),z);
        }
        else if(opt==3){
            int v=read();
            split(root,x,y,v-1);
            printf("%d\n",siz[x]+1);
            root=merge(x,y);
        }
        else if(opt==4){
            int k=read();
            printf("%d\n",val[kth(root,k)]);
        }
        else if(opt==5){
            int v=read();
            split(root,x,y,v-1);
            printf("%d\n",val[kth(x,siz[x])]);
            root=merge(x,y);
        }
        else{
            int v=read();
            split(root,x,y,v);
            printf("%d\n",val[kth(y,1)]);
            root=merge(x,y);
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ErkkiErkko/p/9347752.html
今日推荐