Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
36295 | andy2025 | 【S】T1 | C++ | 通过 | 100 | 2036 MS | 209792 KB | 1638 | 2025-02-10 19:49:09 |
#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 || n == 1) { cout << "-1\n"; continue; } int ans = 0,l = mn.second,r = mx.second,ret = 0; if(l < r) { while(l <= r) { int mid = (l + r) >> 1; if((a[mid] ^ A) > B) r = mid - 1,ret = mid; else l = mid + 1; } ret--; } else { swap(l,r); while(l <= r) { int mid = (l + r) >> 1; if((a[mid] ^ A) > B) l = mid + 1,ret = mid; else r = mid - 1; } } cout << ret << "\n"; } return 0; }