#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define debug puts("------------------------------------")
#define mp make_pair
typedef __int128 LL;
typedef long long ll;
typedef pair<int, int> PII;
namespace HOOOOOCH {
template <typename T>
il void read(T &x) {
x = 0; T f = 1; char ch;
while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
}
template <typename T, typename ...L>
il void read(T &x, L &...y) {read(x); read(y...);}
template <typename T>
il void write(T x) {
if (x < 0) ptc('-'), x = -x;
if (x > 9) write(x / 10);
ptc(x % 10 + '0');
}
}
using namespace HOOOOOCH;
const int N = 2e5 + 5;
#define int long long
int a[N], tot, q, cnt;
int root[N], X, Y, Z;
struct fhq_treap {
struct node {
int ls, rs, sz, rnd, sum, val, tag;
} tr[N * 170];
int make(int val) {return tr[++tot] = {0, 0, 1, rand(), val, val, 0}, tot;}
void pushup(int id) {
tr[id].sum = tr[tr[id].ls].sum + tr[tr[id].rs].sum + tr[id].val;
tr[id].sz = tr[tr[id].ls].sz + tr[tr[id].rs].sz + 1;
}
int rev(int id) {
int a = make(0); tr[a] = tr[id];
tr[a].tag ^= 1;
swap(tr[a].ls, tr[a].rs);
return a;
}
void pushdown(int id) {
if (!tr[id].tag) return ;
if (tr[id].ls) tr[id].ls = rev(tr[id].ls);
if (tr[id].rs) tr[id].rs = rev(tr[id].rs);
tr[id].tag = 0;
}
void split(int &X, int &Y, int sz, int id) {
if (!id) return X = Y = 0, void();
if (tr[tr[id].ls].sz + 1 < sz) {
X = make(0);
tr[X] = tr[id];
pushdown(X);
split(tr[X].rs, Y, sz - tr[tr[X].ls].sz - 1, tr[X].rs);
pushup(X);
}
else {
Y = make(0);
tr[Y] = tr[id];
pushdown(Y);
split(X, tr[Y].ls, sz, tr[Y].ls);
pushup(Y);
}
}
int merge(int id1, int id2) {
if (!id1 || !id2) return id1 | id2;
if (tr[id1].rnd > tr[id2].rnd) {
pushdown(id1);
tr[id1].rs = merge(tr[id1].rs, id2);
pushup(id1);
return id1;
}
pushdown(id2);
tr[id2].ls = merge(id1, tr[id2].ls);
pushup(id2);
return id2;
}
void insert(int pos, int x) {
split(X, Y, pos + 1, root[cnt]);
root[cnt] = merge(X, merge(make(x), Y));
}
void erase(int pos) {
split(X, Y, pos, root[cnt]);
split(Y, Z, 2, Y);
root[cnt] = merge(X, Z);
}
void reverse(int l, int r) {
split(X, Y, l, root[cnt]);
split(Y, Z, (r - l + 2), Y);
Y = rev(Y);
root[cnt] = merge(X, merge(Y, Z));
}
void print(int id) {
if (!id) return ;
pushdown(id);
print(tr[id].ls), cout << tr[id].val << ' ', print(tr[id].rs);
}
} tr;
signed main() {
// freopen("in.in", "r", stdin);
// freopen("out.out", "w", stdout);
srand;
read(q);
int lst = 0;
while (q--) {
int op, x, y, z;
read(z, op, x, y);
x^= lst, y ^= lst;
root[++cnt] = root[z];
if (op == 1) tr.insert(x, y);
else if (op == 2) tr.erase(x);
else if (op == 3) tr.reverse(x, y);
else {
tr.split(X, Y, x, root[cnt]);
tr.split(Y, Z, (y - x + 2), Y);
write(tr.tr[Y].sum), ptc('\n'), lst = tr.tr[Y].sum;
root[cnt] = tr.merge(X, tr.merge(Y, Z));
}
}
return 0;
}
调了很久了,一直不过,求助,如有问题at我,谢谢