#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 7;
typedef long long ll;
const int mod = 1e9 + 9;
int n , m , x;
int a[maxn] , b[maxn];
int sum[maxn] , res1[maxn], res2[maxn] , pr[maxn];
struct node{
int l , r , id;
}num[maxn];
bool cmp(node a,node b){
return a.r < b.r;
}
void update(int pos , int val , int l,int r,int rt){
if(l == r){
sum[rt] += val;
return ;
}
int mid = (l + r) / 2;
if(pos <= mid) update(pos , val , l , mid , rt << 1 );
if(pos > mid) update(pos , val , mid + 1 , r , rt << 1 | 1);
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
int query(int L, int R,int l,int r,int rt){
int ans = 0;
if(L <= l && R >= r){
return sum[rt];
}
int mid = (l + r) / 2;
if(L <= mid) ans += query(L , R , l , mid , rt << 1);
if(R > mid) ans += query(L , R , mid + 1 , r , rt << 1 | 1);
return ans;
}
int main(){
scanf("%d%d%d",&n , &m , &x);
for(int i = 1; i <= n; i ++){
scanf("%d",&a[i]);
b[i] = a[i] ^ x;
}
for(int i = 1; i <= m; i ++){
scanf("%d%d",&num[i].l,&num[i].r);
num[i].id = i;
}
sort(num + 1,num + m + 1 , cmp);
int now = 1;
for(int i = 1; i <= m; i ++){
for(int j = now; j <= num[i].r; j ++){
if(res1[a[j]]){
update(res1[a[j]] , 1 , 1 , n , 1);
}
if(res2[b[j]]){
update(res2[b[j]] , 1 , 1 , n , 1);
}
res2[a[j]] = j;
res1[b[j]] = j;
}
now = num[i].r + 1;
pr[num[i].id] = query(num[i].l , num[i].r , 1 , n , 1);
}
for(int i = 1; i <= m; i ++){
if(pr[i]) printf ("yes\n");
else printf ("no\n");
}
return 0;
}
作者:yxc的小迷妹
链接:https://www.acwing.com/solution/content/158009/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//这里填你的代码^^
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~