持久化fhq treap求条
查看原帖
持久化fhq treap求条
639198
Steve_xh楼主2024/10/9 18:21
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=200005;
int n,cnt=0,rt[MAXN],lastans=0,vers=0;
mt19937 rnd;
struct Treap{
    int sum,p,l,r,sz,v;
    bool tag;
}t[MAXN<<6|1];
inline void newnode(int x){
    t[++cnt].sum=x;
    t[cnt].v=x;
    t[cnt].p=rnd();
    t[cnt].tag=0;
    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;
    t[x].sum=t[t[x].l].sum+t[t[x].r].sum+t[x].v;
}
inline void pushdown(int x){
    if(!t[x].tag)
        return ;
    swap(t[x].l,t[x].r);
    if(t[x].l)
        t[x].l=clone(t[x].l);
    if(t[x].r)
        t[x].r=clone(t[x].r);
    t[t[x].l].tag^=1;
    t[t[x].r].tag^=1;
    t[x].tag=0;
}
void split(int x,int k,int &l,int &r){
    if(!x)
        return (void)(l=r=0);
    pushdown(x);
    if(t[t[x].l].sz+1<=k){
        l=clone(x);
        split(t[x].r,k-t[t[x].l].sz-1,t[x].r,r);
        pushup(l);
    }else{
        r=clone(x);
        split(t[x].l,k,l,t[x].l);
        pushup(r);
    }
    // pushup(x);
}
int merge(int l,int r){
    if(!l||!r)
        return l|r;
    pushdown(l);
    pushdown(r);
    if(t[l].p>t[r].p){
        t[l].r=merge(t[l].r,r);
        pushup(l);
        return l;
    }else{
        t[r].l=merge(l,t[r].l);
        pushup(r);
        return r;
    }
}
signed main(){
    memset(rt,0,sizeof(rt));
    cin.tie(nullptr)->sync_with_stdio(false);
    cin>>n;
    for(int i=1,v,op,x,y,l,r,p;i<=n;i++){
        cin>>v>>op>>x;
        if(op==1){
            cin>>y;
            x^=lastans,y^=lastans;
            split(rt[v],x,l,r);
            newnode(y);
            rt[++vers]=merge(merge(l,cnt),r);
        }else if(op==2){
            x^=lastans;
            split(rt[v],x,l,r);
            split(l,x-1,l,p);
            rt[++vers]=merge(l,r);
        }else if(op==3){
            cin>>y;
            x^=lastans,y^=lastans;
            split(rt[v],y,l,r);
            split(l,x-1,l,p);
            t[p].tag^=1;
            rt[++vers]=merge(merge(l,p),r);
        }else{
            cin>>y;
            x^=lastans,y^=lastans;
            split(rt[v],y,l,r);
            split(l,x-1,l,p);
            cout<<(lastans=t[p].sum)<<'\n';
            rt[++vers]=merge(merge(l,p),r);
        }
    }
    return 0;
}

样例没过,treap开大tle,开小re(?

2024/10/9 18:21
加载中...