思维+dp $O(n)$
$要求[l, r]之间是否存在两个数a \oplus b= x,\\ 可以枚举a \in [l, r], 那么b = a \oplus x\\ 判断b的下标是否在[l, r]之间,由于询问的复杂度已经是O(N)了,\\ 那么判断的复杂度就要小于等于O(logn)\\ 但是这种情况为O(n)\\ 令f(i)表示x左边满足a[f(i)] \oplus i = x且为最近的一个,\\ 那么只需要判断是否f(i) 大于等于l\\ 因为i \in [l, r]所以f(i)在i左边,已经满足小于r\\ 又因为是求是否满足,只要存在即可,所以对于给定r\\ 判断[1, r]之间的f(i)的最大值是否大于l,大于即存在\\ 否则最大的都不大于那就不存在了$
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int f[N], a[N], pos[1 << 20], ma[N];
int n, m, x;
int main(){
scanf("%d%d%d", &n, &m, &x);
for (int i = 1; i <= n; i ++){
scanf("%d", &a[i]);
f[i] = pos[a[i] ^ x];
pos[a[i]] = i;//r左边的,不能包含r,不然不能排除单个数的情况
}
for (int i = 1; i <= n; i ++){
ma[i] = max(ma[i - 1], f[i]);
}
while (m --){
int l, r;
scanf("%d%d", &l, &r);
if (ma[r] >= l) puts("yes");
else puts("no");
}
return 0;
}