01字典树

struct Trie {
static const int N = 1e5 * 33 + 5;
int tr[N][2];
int cnt[N];
int idx = 0;
Trie() {
idx = 0;
}
Trie(int n) {
for (int i = 0; i <= n * 33; i++) {
tr[i][0] = tr[i][1] = cnt[i] = 0;
}
idx = 0;
}
void init(int n) {
for (int i = 0; i <= n * 33; i++) {
tr[i][0] = tr[i][1] = cnt[i] = 0;
}
idx = 0;
}
void add(i64 x) {
int p = 0;
for (int i = 33; i >= 0; i--) {
int cur = x >> i & 1;
if (!tr[p][cur]) {
tr[p][cur] = ++idx;
}
cnt[tr[p][cur]]++;
p = tr[p][cur];
}
}
void erase(i64 x) {
int p = 0;
for (int i = 33; i >= 0; i--) {
int cur = x >> i & 1;
cnt[tr[p][cur]]--;
p = tr[p][cur];
if (cnt[tr[p][cur]] == 0) {
tr[p][cur] = 0;
}
}
}
i64 query(i64 x) { // min
int p = 0;
i64 res = 0;
for (int i = 33; i >= 0; i--) {
int cur = x >> i & 1;
if (tr[p][cur] && cnt[tr[p][cur]]) {
p = tr[p][cur];
} else if (tr[p][cur ^ 1] && cnt[tr[p][cur ^ 1]]) {
res |= 1ll << i;
p = tr[p][cur ^ 1];
} else {
for (int j = i; j >= 0; j--) {
res |= 1ll << j & x;
}
break;
}
}
return res;
}
};