#include <cstdio>
#include <cstdlib>
#include <ctime>
typedef long long ll;
const int N = 200005 * 50;
bool rev[N];
ll a, b, last, v[N], w[N], s[N];
int sz[N], ch[N][2], root[N];
int n, l, m, r, tot;
int newnode(ll x) {
tot++;
v[tot] = s[tot] = x;
w[tot] = rand();
sz[tot] = 1;
return tot;
}
int clone(ll x) {
v[++tot] = v[x];
w[tot] = w[x];
s[tot] = s[x];
sz[tot] = sz[x];
ch[tot][0] = ch[x][0];
ch[tot][1] = ch[x][1];
return tot;
}
void pushup(int x) {
sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
s[x] = s[ch[x][0]] + s[ch[x][1]] + v[x];
}
void pushdown(int x) {
if (!rev[x]) return;
if (ch[x][0]) ch[x][0] = clone(ch[x][0]);
if (ch[x][1]) ch[x][1] = clone(ch[x][1]);
int tmp = ch[x][0];
ch[x][0] = ch[x][1];
ch[x][1] = tmp;
if (ch[x][0]) rev[ch[x][0]] ^= 1;
if (ch[x][1]) rev[ch[x][1]] ^= 1;
rev[x] = 0;
}
int merge(int l, int r) {
if (!l || !r) return l + r;
if (w[l] < w[r]) {
pushdown(l);
ch[l][1] = merge(ch[l][1], r);
pushup(l);
return l;
}
pushdown(r);
ch[r][0] = merge(l, ch[r][0]);
pushup(r);
return r;
}
void split(int rt, int k, int &l, int &r) {
if (!rt) l = r = 0;
else {
pushdown(rt);
if (k <= sz[ch[rt][0]]) {
r = clone(rt);
split(ch[rt][0], k, l, ch[r][0]);
pushup(r);
} else {
l = clone(rt);
split(ch[rt][1], k - sz[ch[rt][0]] - 1, ch[l][1], r);
pushup(l);
}
}
}
void insert(int &rt, int p, ll x) {
split(rt, p, l, r);
rt = merge(merge(l, newnode(x)), r);
}
void remove(int &rt, ll p) {
split(rt, p, l, r);
split(r, p + 1, m, r);
m = merge(ch[m][0], ch[m][1]);
rt = merge(merge(l, m), r);
}
void reverse(int &rt, int a, int b) {
split(rt, b, l, r);
split(l, a - 1, l, m);
rev[m] ^= 1;
rt = merge(merge(l, m), r);
}
ll query(int &rt, int a, int b) {
split(rt, b, l, r);
split(l, a - 1, l, m);
int sum = s[m];
rt = merge(merge(l, m), r);
return sum;
}
int main() {
srand(0);
scanf("%d", &n);
for (int i = 1, v, opt; i <= n; i++) {
scanf("%d%d%lld", &v, &opt, &a);
root[i] = root[v];
a ^= last;
if (opt == 1) {
scanf("%lld", &b);
b ^= last;
insert(root[i], a, b);
}
if (opt == 2) remove(root[i], a);
if (opt == 3) {
scanf("%lld", &b);
b ^= last;
reverse(root[i], a, b);
}
if (opt == 4) {
scanf("%lld", &b);
b ^= last;
last = query(root[i], a, b);
printf("%lld\n", last);
}
}
return 0;
}