写了对拍文件跟std的答案一模一样,
结果还听取WA声一片
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define ls(now) fhq[now].l
#define rs(now) fhq[now].r
using namespace std;
const int N=2e5+10;
#define int long long
struct fhqTreap {
int l,r;
int val,key,size,sum;
bool tag;
} fhq[N<<7];
int n,m,cnt=0,rt[N],last;
inline int newnode(int val) {
fhq[++cnt].val=fhq[cnt].sum=val;
fhq[cnt].key=rand();
fhq[cnt].size=1;
return cnt;
}
inline void pushup(int now) {
fhq[now].size=fhq[ls(now)].size+fhq[rs(now)].size+1;
fhq[now].sum=fhq[ls(now)].sum+fhq[rs(now)].sum+fhq[now].val;
}
inline int clone(int now) {
int res=newnode(0);
fhq[res]=fhq[now];
return res;
}
inline void pushdown(int now) {
if(ls(now))ls(now)=clone(ls(now)),fhq[ls(now)].tag^=1;
if(rs(now))rs(now)=clone(rs(now)),fhq[rs(now)].tag^=1;
swap(ls(now),rs(now));
fhq[now].tag=0;
}
int merge(int x,int y) {
if(!x||!y)return x|y;
if(fhq[x].tag)pushdown(x);
if(fhq[y].tag)pushdown(y);
if(fhq[x].key>fhq[y].key) {
rs(x)=merge(rs(x),y);
pushup(x);return x;
} else {
ls(y)=merge(x,ls(y));
pushup(y);return y;
}
}
void split(int now,int sz,int &x,int &y) {
if(!now)x=y=0;
else {
if(fhq[now].tag)pushdown(now);
if(fhq[ls(now)].size<sz) {
x=clone(now);
split(rs(x),sz-fhq[ls(now)].size-1,rs(x),y);
pushup(x);
} else {
y=clone(now);
split(ls(y),sz,x,ls(y));
pushup(y);
}
}
}
signed main() {
srand(114514);
scanf("%lld",&n);
int v,op,a,b,x,y,z;
for(int i=1; i<=n; i++) {
scanf("%lld%lld",&v,&op);
switch(op) {
case 1:
scanf("%lld%lld",&a,&b);
a^=last;b^=last;
split(rt[v],a,x,y);
rt[i]=merge(merge(x,newnode(b)),y);
break;
case 2:
scanf("%lld",&a);
a^=last;
split(rt[v],a,x,z);
split(x,a-1,x,y);
rt[i]=merge(x,z);
break;
case 3:
scanf("%lld%lld",&a,&b);
a^=last;b^=last;
split(rt[v],b,x,z);
split(x,a-1,x,y);
fhq[y].tag^=1;
rt[i]=merge(merge(x,y),z);
break;
case 4:
scanf("%lld%lld",&a,&b);
a^=last;b^=last;
split(rt[v],b,x,z);
split(x,a-1,x,y);
printf("%lld\n",last=fhq[y].sum);
rt[i]=merge(merge(x,y),z);
break;
}
}
return 0;
}