样例过不了,提交上去大红大紫:https://www.luogu.com.cn/record/119350527
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int root[N],cnt=0;
struct FHQTreap{
int ls,rs,pri,size,tag;
long long sum; int val;
}tree[N<<7];
int newnode(int p){
tree[++cnt].size=1;
tree[cnt].pri=rand();
tree[cnt].ls=tree[cnt].rs=0;
tree[cnt].sum=tree[cnt].val=p;
tree[cnt].tag=0; return cnt;
}
int clone(int p){
int res=newnode(0);
tree[res]=tree[p]; return res;
}
void replace(int p){
int pl=tree[p].ls,pr=tree[p].rs;
tree[p].size=tree[pl].size+tree[pr].size+1;
tree[p].sum=tree[pl].sum+tree[pr].sum+tree[p].val;
}
void pushdown(int p){
if(!tree[p].tag) return;
if(tree[p].ls) tree[p].ls=clone(tree[p].ls);
if(tree[p].rs) tree[p].rs=clone(tree[p].rs);
swap(tree[p].ls,tree[p].rs); tree[p].tag=0;
if(tree[p].ls) tree[tree[p].ls].tag^=1;
if(tree[p].rs) tree[tree[p].rs].tag^=1;
}
void split(int p,int d,int &pl,int &pr){
if(p==0){pl=pr=0;return;} pushdown(p);
if(tree[tree[p].ls].size<d){ pl=clone(p);
int pls=tree[pl].ls,prs=tree[pl].rs;
split(prs,d-tree[tree[p].ls].size-1,tree[pl].rs,pr);
replace(pl); return;
}
if(tree[tree[p].rs].size>=d){ pr=clone(p);
split(tree[pr].ls,d,pl,tree[pr].ls);
replace(pr); return;
}
}
int merge(int pl,int pr){
if(pl==0||pr==0) return pl+pr;
pushdown(pl); pushdown(pr);
if(tree[pl].pri>tree[pr].pri){
tree[pl].rs=merge(tree[pl].rs,pr);
replace(pl); return pl;
}
if(tree[pl].pri<=tree[pr].pri){
tree[pr].ls=merge(pl,tree[pr].ls);
replace(pr); return pr;
}
}
int main(){
srand(time(NULL));
long long lastans=0;
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
int v,opt;scanf("%d%d",&v,&opt);
if(opt==1){
long long p;scanf("%lld",&p);
long long d;scanf("%lld",&d);
p^=lastans; d^=lastans;
int pl,pr; split(root[v],p,pl,pr);
root[i]=merge(merge(pl,newnode(d)),pr);
}
if(opt==2){
long long p;scanf("%lld",&p); p^=lastans;
int pl,pr,q; split(root[v],p,pl,pr);
split(pl,p-1,pl,q); root[i]=merge(pl,pr);
}
if(opt==3){
long long l;scanf("%lld",&l);
long long r;scanf("%lld",&r);
l^=lastans; r^=lastans;
int pl,pr,q; split(root[v],r,pl,pr);
split(pl,l-1,pl,q); tree[q].tag^=1;
root[i]=merge(merge(pl,q),pr);
}
if(opt==4){
long long l;scanf("%lld",&l);
long long r;scanf("%lld",&r);
l^=lastans; r^=lastans;
int pl,pr,q; split(root[v],r,pl,pr);
split(pl,l-1,pl,q);
lastans=tree[q].sum; printf("%lld\n",lastans);
root[i]=merge(merge(pl,q),pr);
}
}
return 0;
}