样例已过
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int m, n, idx, rt, rt1, rt2, rt3, ret, lst, ans;
struct FHQ{
int ls;
int rs;
int siz;
int val;
int rnd;
}tree[N];
inline void pushup(int x) {
tree[x].siz = tree[tree[x].ls].siz + tree[tree[x].rs].siz + 1;
}
inline void split(int now, int val, int &x, int &y) {
if (!now) {
x = y = 0;
return;
}
if (tree[now].val <= val) {
x = now;
split(tree[now].rs, val, tree[now].rs, y);
}
else {
y = now;
split(tree[now].ls, val, x, tree[now].ls);
}
pushup(now);
}
inline int merge(int x, int y) {
if (!x) return y;
if (!y) return x;
if (tree[x].rnd < tree[y].rnd) {
tree[x].rs = merge(tree[x].rs, y);
pushup(x);
return x;
}
else {
tree[y].ls = merge(x, tree[y].ls);
pushup(y);
return y;
}
}
inline int create(int x) {
tree[++idx].val = x;
tree[idx].siz = 1;
tree[idx].rnd = rand();
return idx;
}
inline void insert(int x) {
split(rt, x, rt1, rt2);
rt = merge(merge(rt1, create(x)), rt2);
}
inline void del(int x) {
split(rt, x, rt2, rt3);
split(rt2, x - 1, rt1, rt2);
rt2 = merge(tree[rt2].ls, tree[rt2].rs);
rt = merge(merge(rt1, rt2), rt3);
}
inline int rk(int x) {
split(rt, x - 1, rt1, rt2);
ret = tree[rt1].siz + 1;
rt = merge(rt1, rt2);
return ret;
}
inline int kth(int now, int k) {
while(1) {
if (k <= tree[tree[now].ls].siz) now = tree[now].ls;
else if (k == tree[tree[now].ls].siz + 1) return tree[now].val;
else {
k -= tree[tree[now].ls].siz + 1;
now = tree[now].rs;
}
}
}
inline int pre(int x) {
split(rt, x - 1, rt1, rt2);
ret = kth(rt1, tree[rt1].siz);
rt = merge(rt1, rt2);
return ret;
}
inline int suf(int x) {
split(rt, x, rt1, rt2);
ret = kth(rt2, 1);
rt = merge(rt1, rt2);
return ret;
}
int main() {
cin.tie(0) -> sync_with_stdio(0);
cin >> m >> n;
for (int i = 1, x; i <= m; ++i) {
cin >> x;
insert(x);
}
for (int i = 1, op, x; i <= n; ++i) {
cin >> op >> x;
x ^= lst;
lst = 0;
if (op == 1) insert(x);
if (op == 2) del(x);
if (op == 3) lst = rk(x);
if (op == 4) lst = kth(rt, x);
if (op == 5) lst = pre(x);
if (op == 6) lst = suf(x);
ans ^= lst;
}
cout << ans;
}