前言:打比赛时想到这个解法,但不知道正确不正确,看起来挺真的,可是50pts。
思路:容易发现,在左端点固定的情况下,右端点越右越不可能,所以具有单调性。然后就想到二分或双指针,二分不太可行,所以双指针,然而我们可以记录两个值,一个是这个数的个数,一个数是这个数^x的个数,然后就可以搞了,但50pts。
代码:
#include <bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
const int N=1e5+5;
int n,m,x;
int a[N],b[N],check[N];
map<int,int>mp;
map<int,int>mp2;
signed main(){
cin>>n>>m>>x;
rep(i,1,n){
cin>>a[i];
b[i]=a[i]^x;
}
int cnt=0,l=1,r=1;
while(r<=n||l<=n){
if(r<l)mp.clear(),mp2.clear(),cnt=0;
r=max(l,r);
while(r<=n&&cnt<=0){
cnt+=mp[b[r]];
mp[a[r]]++;
mp2[b[r]]++;
if(cnt>0)break;
++r;
}
check[l]=r;
cnt-=mp2[a[l]];
mp[a[l]]--;
mp2[b[l]]--;
++l;
}
rep(i,1,m){
int l,r;
cin>>l>>r;
if(r>=check[l]){
cout<<"yes"<<endl;
}
else{
cout<<"no"<<endl;
}
}
return 0;
}