12
Trie *insert(Trie *node, int k, int num) {16
if (k < 0) return node;17
if (((num >> k) & 1) == 1) {18
node->o = insert(node->o, k - 1, num);20
node->z = insert(node->z, k - 1, num);25
int getmax(Trie *node, int k, int num) {28
bool bit = ((num >> k) & 1);31
res = pow(2, k) + getmax(node->z, k - 1, num);33
res = getmax(node->o, k - 1, num);37
res = pow(2, k) + getmax(node->o, k - 1, num);39
res = getmax(node->z, k - 1, num);45
vector<int> maximizeXor(vector<int> &nums, vector<vector<int>> &queries) {47
int m = queries.size();48
vector<int> ans(m, -1);49
vector<pair<pair<int, int>, int>> q;50
for (int i = 0; i < m; i++) {51
q.push_back({{queries[i][0], queries[i][1]}, i});53
sort(q.begin(), q.end(), [](pair<pair<int, int>, int> a, pair<pair<int, int>, int> b) {54
return a.first.second < b.first.second;57
sort(nums.begin(), nums.end());61
Trie *root = new Trie();63
for (int i = 0; i < m; i++) {64
pair<pair<int, int>, int> p = q[i];65
int num = p.first.first;66
int lim = p.first.second;69
while (j < n && nums[j] <= lim) {70
root = insert(root, 31, nums[j]);75
ans[idx] = getmax(root, 31, num);