显示原始代码
#include <bits/stdc++.h>
#define db double
#define ll long long
#define vi vector<int>
#define vii vector<vi>
#define pii pair<int, int>
#define vp vector<pii>
#define vip vector<vp>
#define mkp make_pair
#define pb push_back
#define Case(x) cout << "Case #" << x << ": "
using namespace std;
const int INF = 0x3f3f3f3f;
const int P = 998244353;
const int N = 1e7 + 10;
struct Node {
Node *ch[2];
int cnt, sz, val, dep;
Node() {
ch[0] = ch[1] = nullptr;
sz = val = dep = 0;
}
};
int tot;
void pushup(Node *p) {
p->val = 0;
p->sz = p->cnt;
for (int i = 0; i < 2; i++) {
Node *ch = p->ch[i];
if (ch) {
p->sz += ch->sz;
p->val ^= ch->val;
if (ch->sz & 1) {
p->val ^= i << (p->dep);
}
}
}
}
void insert(Node *&p, int x, int dep) {
if (!p) {
p = new Node;
p->dep = dep;
}
if (!x) {
p->sz++;
p->cnt++;
return;
}
insert(p->ch[x & 1], x >> 1, dep + 1);
pushup(p);
}
void add_one(Node *p) {
if (!p)
return;
swap(p->ch[0], p->ch[1]);
add_one(p->ch[0]);
if (p->cnt) {
Node *&q = p->ch[1];
if (!q)
q = new Node;
q->cnt += p->cnt;
q->sz += p->cnt;
p->cnt = 0;
q->dep = p->dep + 1;
}
pushup(p);
}
signed main() {
#ifdef _DEBUG
freopen("1.in", "r", stdin);
FILE *file = freopen("out", "w", stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
int Q;
cin >> Q;
Node *rt = new Node;
while (Q--) {
int opt, x;
cin >> opt;
if (opt == 1) {
add_one(rt);
} else {
cin >> x;
insert(rt, x, 0);
}
cout << rt->val << '\n';
}
return 0;
}