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; }};