0pt WA 可持久化FHQ Treap求条
查看原帖
0pt WA 可持久化FHQ Treap求条
639198
Steve_xh楼主2024/10/10 11:33
#include<bits/stdc++.h>
// #define int long long
using namespace std;
const int MAXN=500005;
struct Treap{
    int x,p,l,r,sz;
}t[MAXN<<7|1];
int n,rt[MAXN],cnt=0,vers=0;
mt19937 rnd(114514ull);
inline void newnode(int x){
    t[++cnt].x=x;
    t[cnt].p=rnd();
    t[cnt].l=t[cnt].r=0;
    t[cnt].sz=1;
}
inline int clone(int x){
    newnode(0);
    t[cnt]=t[x];
    return cnt;
}
inline void pushup(int x){
    t[x].sz=t[t[x].l].sz+t[t[x].r].sz+1;
}
void split(int x,int w,int &l,int &r){
    if(!x)
        return (void)(l=r=0);
    if(t[x].x<=w){
        l=clone(x); 
        split(t[l].r,w,t[l].r,r);
        pushup(l);
    }else{
        r=clone(x);
        split(t[r].l,w,l,t[r].l);
        pushup(r);
    }
}
int merge(int l,int r){
    if(!l||!r)
        return l|r;
    if(t[l].p>t[r].p){
        l=clone(l);
        t[l].r=merge(t[l].r,r);
        pushup(l);
        return l;
    }else{
        r=clone(r);
        t[r].l=merge(l,t[r].l);
        pushup(r);
        return r;
    }
}
void insert(int x,int v){
    int l,r;
    split(rt[v],x,l,r);
    newnode(x);
    rt[vers]=merge(merge(l,cnt),r);
}
void del(int x,int v){
    int l,r,p;
    split(rt[v],x,l,r);
    split(l,x-1,l,p);
    rt[vers]=merge(l,r);
}
int rk(int x,int v){
    int l,r,sz=t[rt[v]].sz,ans;
    split(rt[v],x,l,r);
    ans=sz-t[r].sz;
    rt[v]=merge(l,r);
    return ans;
}
int kth(int x,int k){
    if(k==t[t[x].l].sz+1)
        return x;
    if(k<=t[t[x].l].sz)
        return kth(t[x].l,k);
    else
        return kth(t[x].r,k-t[t[x].l].sz-1);
}
int prevt(int x,int v){
    int l,r,ans;
    split(rt[v],x-1,l,r);
    if(!l)
        return -(1ll<<31)+1ll;
    ans=t[kth(l,t[l].sz)].x;
    rt[v]=merge(l,r);
    return ans;
}
int nextt(int x,int v){
    int l,r,ans;
    split(rt[v],x,l,r);
    if(!r)
        return (1ll<<31)-1ll;
    ans=t[r].x;
    rt[v]=merge(l,r);
    return ans;
}
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin>>n;
    for(int i=1,v,op,x;i<=n;i++){
        cin>>v>>op>>x;
        rt[i]=rt[v];
        if(op==1)
            insert(x,i);
        else if(op==2)
            del(x,i);
        else if(op==3)
            cout<<rk(x,i)<<'\n';
        else if(op==4)
            cout<<t[kth(rt[i],x)].x<<'\n';
        else if(op==5)
            cout<<prevt(x,i)<<'\n';
        else
            cout<<nextt(x,i)<<'\n';
    }
    return 0;
}
2024/10/10 11:33
加载中...