rt,问题如上,代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
struct fhq_treap{
int val, sum, pri, sz, tag, son[2];
} trp[N << 6];
int n, sum, rt[N];
void update(int u){
trp[u].sz = trp[trp[u].son[0]].sz + trp[trp[u].son[1]].sz + 1;
trp[u].sum = trp[trp[u].son[0]].sum + trp[trp[u].son[1]].sum + trp[u].val;
}
int newnode(int val){
++sum;
trp[sum].val = trp[sum].sum = val, trp[sum].pri = rand(), trp[sum].sz = 1;
return sum;
}
void pushdown(int u){
int ls = trp[u].son[0], rs = trp[u].son[1];
if(trp[u].tag){
if(ls){
int lls = newnode(0), rls = newnode(0);
trp[lls] = trp[trp[ls].son[0]], trp[rls] = trp[trp[ls].son[1]];
swap(trp[ls].son[0], trp[ls].son[1]);
trp[trp[u].son[0]].tag ^= 1;
}
if(rs){
int rls = newnode(0), rrs = newnode(0);
trp[rls] = trp[trp[rs].son[0]], trp[rrs] = trp[trp[rs].son[1]];
swap(trp[rs].son[0], trp[rs].son[1]);
trp[trp[u].son[1]].tag ^= 1;
}
trp[u].tag ^= 1;
}
}
void split(int u, int k, int &rta, int &rtb){
if(!u){
rta = rtb = 0;
return ;
}
pushdown(u);
if(trp[trp[u].son[0]].sz < k){
rta = newnode(0);
trp[rta] = trp[u];
split(trp[rta].son[1], k - trp[trp[rta].son[0]].sz - 1, trp[rta].son[1], rtb);
update(rta);
}else{
rtb = newnode(0);
trp[rtb] = trp[u];
split(trp[rtb].son[0], k, rta, trp[rtb].son[0]);
update(rtb);
}
}
int merge(int rta, int rtb){
if(!rta || !rtb) return rta + rtb;
if(trp[rta].pri < trp[rtb].pri){
pushdown(rta);
trp[rta].son[1] = merge(trp[rta].son[1], rtb);
update(rta);
return rta;
}else{
pushdown(rtb);
trp[rtb].son[0] = merge(rta, trp[rtb].son[0]);
update(rtb);
return rtb;
}
}
void insert(int ver, int k, int w){
int x, y;
split(rt[ver], k, x, y);
rt[ver] = merge(merge(x, newnode(w)), y);
}
void del(int ver, int w){
int x, y, z;
split(rt[ver], w, x, z);
split(x, w - 1, x, y);
rt[ver] = merge(x, z);
}
void reverse(int ver, int l, int r){
int x, y, z;
split(rt[ver], l - 1, x, y);
split(y, r - l + 1, y, z);
int ls = newnode(0), rs = newnode(0);
trp[ls] = trp[trp[y].son[0]], trp[rs] = trp[trp[y].son[1]];
swap(trp[y].son[0], trp[y].son[1]);
trp[y].tag ^= 1;
rt[ver] = merge(x, merge(y, z));
}
int query(int ver, int l, int r){
int x, y, z;
split(rt[ver], l - 1, x, y);
split(y, r - l + 1, y, z);
int ans = trp[y].sum;
rt[ver] = merge(x, merge(y, z));
return ans;
}
main(){
int lastans = 0;
scanf("%lld", &n);
for(int i=1;i<=n;i++){
int v, op, p, x, l, r;
scanf("%lld%lld", &v, &op);
rt[i] = rt[v];
if(op == 1){
scanf("%lld%lld", &p, &x);
p ^= lastans, x ^= lastans;
insert(i, p, x);
}else if(op == 2){
scanf("%lld", &p);
p ^= lastans;
del(i, p);
}else if(op == 3){
scanf("%lld%lld", &l, &r);
l ^= lastans, r ^= lastans;
if(l > r) swap(l, r);
reverse(i, l, r);
}else if(op == 4){
scanf("%lld%lld", &l, &r);
l ^= lastans, r ^= lastans;
if(l > r) swap(l, r);
lastans = query(i, l, r);
printf("%lld\n", lastans);
}
}
return 0;
}