检查了n边,不知道为什么TLE了
#include<bits/stdc++.h>
using namespace std;
long long n,m,k,a[500005],c[1000005],b[500005],answer[500005],bel[500005];
long long ans;
int rd(){
int x=0;char ch=getchar();
while(!(ch>='0' && ch<='9'))ch=getchar();
while((ch>='0' && ch<='9')){
x=(x<<1)+(x<<3)+int(ch-'0');
ch=getchar();
}
return x;
}
struct node{
long long l,r,id;
}q[500005];
bool cmp(node l,node r){
return (bel[l.l]^bel[r.l])?bel[l.l]<bel[r.l]:((bel[l.l]&1)?l.r<r.r:r.r>r.r);
}
void build(){
int kk=sqrt(n);
for(int i=1;i<=n;i++){
bel[i]=(i+kk-1)/kk;
}
return ;
}
void jia(long long i){
ans+=c[b[i]];
c[a[i]]++;
return ;
}
void jian(long long i){
c[a[i]]--;
ans-=c[b[i]];
return ;
}
int main(){
n=rd();
m=rd();
k=rd();
build();
for(long long i=1;i<=n;i++){
a[i]=rd();
a[i]=a[i]^a[i-1];
b[i]=a[i]^k;
}
for(long long i=1;i<=m;i++){
q[i].l=rd();
q[i].r=rd();
q[i].id=i;
}
sort(q+1,q+1+m,cmp);
long long ll=0,rr=0;
c[0]++;
for(long long i=1;i<=m;i++){
while(rr<q[i].r){
jia(++rr);
}
while(rr>q[i].r){
jian(rr--);
}
while(ll<q[i].l-1){
jian(ll++);
}
while(ll>q[i].l-1){
jia(--ll);
}
answer[q[i].id]=ans;
}
for(long long i=1;i<=m;i++){
cout<<answer[i]<<"\n";
}
return 0;
}