提交时间:2025-02-10 14:32:06
运行 ID: 36228
#include <bits/stdc++.h> using namespace std; int n,q,trie[30000010][2],pos[30000010],tot = 1,a[1000010]; void insert(int val,int q) { int p = 1; for(int i = 30;~i;--i) { int nxt = (val >> i) & 1; if(!trie[p][nxt]) trie[p][nxt] = ++tot; p = trie[p][nxt]; } pos[p] = q; } pair <int,int> ask1(int val) { int ans = 0,p = 1; for(int i = 30;~i;--i) { int nxt = (val >> i) & 1; nxt ^= 1; if(trie[p][nxt]) ans += (1 << i),p = trie[p][nxt]; else p = trie[p][nxt ^ 1]; } return make_pair(ans,pos[p]); } pair <int,int> ask2(int val) { int ans = 0,p = 1; for(int i = 30;~i;--i) { int nxt = (val >> i) & 1; if(trie[p][nxt]) p = trie[p][nxt]; else ans += (1 << i),p = trie[p][nxt ^ 1]; } return make_pair(ans,pos[p]); } int main() { /*freopen("function2.in","r",stdin); freopen("function2.out","w",stdout);*/ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> q; for(int i = 1;i <= n;i++) { cin >> a[i]; insert(a[i],i); } while(q--) { int A,B; cin >> A >> B; pair <int,int> mx = ask1(A); pair <int,int> mn = ask2(A); if(mx.first > B && mn.first > B || mx.first < B && mn.first < B) { cout << "-1\n"; continue; } int ans = 0,l = min(mn.second,mx.second),r = max(mx.second,mn.second) - 1; while(l + 1 < r) { int mid = (l + r) >> 1; int Fmid = (a[mid] ^ A); if(Fmid > B) { if(mn.second < mid) r = mid - 1; else l = mid; } else { if(mx.second < mid) r = mid - 1; else l = mid; } } cout << l<< "\n"; } return 0; }