显示原始代码
#include "bits/stdc++.h"
using namespace std;
const int trieDepth = 32;
const int maxn = 2e5 + 7;
struct TrieNode {
int cnt[2]{};
int next[2]{};
TrieNode() { cnt[0] = cnt[1] = next[0] = next[1] = 0; }
};
TrieNode trieTree[maxn * trieDepth];
int bitsCnt[trieDepth];
int trieNodeCnt = 1;
void insert(int num);
void insert(int num) {
int curTrieIndex = 0;
for (uint depth = 0; depth < trieDepth; ++depth) {
int curBit = (num >> depth) & 1;
trieTree[curTrieIndex].cnt[curBit]++;
bitsCnt[depth] += curBit;
if (trieTree[curTrieIndex].next[curBit] == 0) {
trieTree[curTrieIndex].next[curBit] = trieNodeCnt;
trieNodeCnt++;
}
curTrieIndex = trieTree[curTrieIndex].next[curBit];
}
}
void update(int trieIndex, int depth);
void update(int trieIndex, int depth) {
TrieNode curTrieNode = trieTree[trieIndex];
if (curTrieNode.next[1] != 0) {
update(curTrieNode.next[1], depth + 1);
}
bitsCnt[depth] += (curTrieNode.cnt[0] - curTrieNode.cnt[1]);
swap(trieTree[trieIndex].next[0], trieTree[trieIndex].next[1]);
swap(trieTree[trieIndex].cnt[0], trieTree[trieIndex].cnt[1]);
}
int query();
int query() {
int ans = 0;
for (int depth = 0; depth < trieDepth; ++depth) {
ans |= (bitsCnt[depth] & 1) << depth;
}
return ans;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int opt;
cin >> opt;
if (opt == 1) {
update(0, 0);
} else {
int newNum;
cin >> newNum;
insert(newNum);
}
cout << query() << endl;
}
}