题目中说
x′ 表示加密后的操作数。
怎么解密?也没说是怎么加密的啊。
56pts
#include <iostream>
using namespace std;
#define long long int
const int N = 1100005;
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]
struct node {
int s[2], val, siz, fa, cnt;
void init(int v, int p) {
val = v, fa = p;
siz = 1;
cnt = 1;
}
void clear() {
s[1] = s[0] = val = siz = fa = cnt = 0;
}
} tr[N];
int rt, id;
void pushup(int u) {
tr[u].siz = (tr[ls(u)].siz + tr[rs(u)].siz + tr[u].cnt);
}
void rotate(int x) {
int y = tr[x].fa;
int z = tr[y].fa;
bool k = tr[y].s[1] == x;
tr[z].s[tr[z].s[1] == y] = x, tr[x].fa = z;
tr[y].s[k] = tr[x].s[!k], tr[tr[x].s[!k]].fa = y;
tr[x].s[!k] = y, tr[y].fa = x;
pushup(y);
pushup(x);
}
void splay(int x, int k) {
while (tr[x].fa != k) {
int y = tr[x].fa, z = tr[y].fa;
if (z != k) {
if ((tr[y].s[1] == x) ^ (tr[z].s[1] == y))
rotate(x);
else
rotate(y);
}
rotate(x);
}
if (!k)
rt = x;
}
void insert(int v) {
int u = rt, fa = 0;
while (u) {
if (tr[u].val == v) {
tr[u].cnt++;
tr[u].siz++;
splay(u, 0);
return;
}
fa = u;
u = tr[u].s[v > tr[u].val];
}
u = ++id;
if (fa)
tr[fa].s[v > tr[fa].val] = u;
tr[u].init(v, fa);
splay(u, 0);
}
void find(int v) {
int u = rt;
while (1) {
if (tr[u].val == v) {
splay(u, 0);
break;
}
u = tr[u].s[v > tr[u].val];
}
}
void pre() {
int u = ls(rt);
while (rs(u)) {
u = rs(u);
}
splay(u, 0);
}
void lst() {
int u = rs(rt);
while (ls(u)) {
u = ls(u);
}
splay(u, 0);
}
void del(int v) {
find(v);
int x = ls(rt), y = rs(rt);
if (tr[rt].cnt > 1) {
tr[rt].cnt--, tr[rt].siz--;
}
else if ((!x) && (!y)) {
tr[rt].clear();
rt = 0;
}
else if (!x) {
tr[rt].clear();
rt = y;
tr[y].fa = 0;
}
else if (!y) {
tr[rt].clear();
rt = x;
tr[x].fa = 0;
}
else {
int cur = rt;
pre();
rs(rt) = rs(cur);
tr[rs(cur)].fa = rt;
pushup(rt);
tr[cur].clear();
}
}
int get_k(int k) {
int u = rt;
while (1) {
if (ls(u) && k <= tr[ls(u)].siz) {
u = ls(u);
}
else {
k -= tr[ls(u)].siz;
if (k - tr[u].cnt <= 0) {
splay(u, 0);
return tr[u].val;
}
else {
k -= tr[u].cnt;
u = rs(u);
}
}
}
return 0;
}
signed main() {
int n, m, opt, x, lastans = 0, ans = 0;// , last2;
(void)scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
(void)scanf("%d", &x);
insert(x);
}
for (int i = 1; i <= m; i++) {
(void)scanf("%d%d", &opt, &x);
x ^= lastans;
if (opt == 1) {
insert(x);
}
else if (opt == 2) {
del(x);
}
else if (opt == 3) {
insert(x);
lastans = tr[ls(rt)].siz + 1;
del(x);
}
else if (opt == 4) {
lastans = get_k(x);
}
else if (opt == 5) {
insert(x);
pre();
lastans = tr[rt].val;
del(x);
}
else {
insert(x);
lst();
lastans = tr[rt].val;
del(x);
}
ans ^= lastans;
}
printf("%d\n", ans);
return 0;
}