提交时间:2025-02-10 16:54:42
运行 ID: 36275
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 5, inf = 2147483647; int n, q, cnt, trie[N << 5][2], up, nm[N], x[N]; bool num[32]; void update(int x, int y) { if(y > 30) { nm[x] = up; return; } bool to = num[y]; if(!trie[x][to]) trie[x][to] = ++cnt; update(trie[x][to], y + 1); } int query(int x, int y) { if(y > 30) return nm[x]; bool to = num[y]; if(!trie[x][to]) return query(trie[x][!to], y + 1); else return query(trie[x][to], y + 1); } int main() { freopen("slpjbh.in", "r", stdin); freopen("slpjbh.out", "w", stdout); scanf("%d%d", &n, &q); for(up = 1; up <= n; ++up) { scanf("%d", x + up); int xx = x[up]; for(int i = 30; ~i; --i) { num[i] = xx & 1; xx >>= 1; } update(0, 0); } while(q--) { int a, b; scanf("%d%d", &a, &b); if(n == 1) puts("-1"); else { int aa = a; for(int i = 30; ~i; --i) { num[i] = aa & 1; aa >>= 1; } int l = query(0, 0); aa = inf ^ a; for(int i = 30; ~i; --i) { num[i] = aa & 1; aa >>= 1; } int r = query(0, 0); if(l > r) swap(l, r); if(((a ^ x[l]) - b) * ((a ^ x[r]) - b) > 0) puts("-1"); else { if(!x[l]) printf("%d\n", l); else if(!x[r]) printf("%d\n", r); else { while(l + 1 < r) { int mid = l + r >> 1; //cout << l << " " << r << " " << mid << endl; if(((a ^ x[mid]) - b) * ((a ^ x[l]) - b) <= 0) r = mid; else l = mid; } printf("%d\n", l); } } } } return 0; }