https://www.acwing.com/problem/content/4648/
// 解析
// ai ^ aj = x
// => aj = x ^ ai
// 首先 l <= i && <= r
// j <= l && j >= r
// 选择一个 i 对应的 j 要在 l 到 r 区间 还需要满足异或的条件
// 那么就是 f[i] <= l && f[i] <= r
// 如果 i < l 的话 那么 f[i] 一定是没有答案的
// 所以说 i 可以扩大到 1 <= i <= r
// 那么题意就变为在 1--r中选择一个数 i 使得 f[i] 满足 异或的条件
// 那么我们只需要预处理出 f[r] >= l 是否存在即可
// 预处理出每一个 i 前面所有满足条件的f[i]
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010 , M = 1 << 20;
int f[N] , a[N];
int n , m , x;
int last[M];
int main()
{
cin >> n >> m >> x;
for(int i = 1 ; i <= n ; i ++)
{
int a;
cin >> a;
f[i] = max(f[i - 1] , last[x ^ a]);
// f[i] 存的是最大的存在下标
last[a] = i;
}
// 1 2 3 4
while (m -- )
{
int l , r;
cin >> l >> r;
if(f[r] >= l) puts("yes"); // f[r] 一定小于 r 因为在更新的时候 last[a] = i 是在后面更新的
else puts("no");
}
return 0;
}