块长取啥都过不了。
玄关。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
constexpr int N=2e5+5;
int n,m,k,a[N],block,cnt[N];
ll sum,ans[N];
struct Query {
int id,l,r;
} que[N];
bool cmp(Query &A,Query &B) {
int posA=A.l/block,posB=B.l/block;
if(A.l!=B.l) return A.l<B.l;
if(A.l&1) return A.r>B.r;
else return A.r<B.r;
}
inline void add(int x) {
sum+=cnt[a[x]^k];
cnt[a[x]]++;
}
inline void del(int x) {
cnt[a[x]]--;
sum-=cnt[a[x]^k];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
block=sqrt(n),cnt[0]=1;
for(int i=1;i<=n;i++) cin>>a[i],a[i]^=a[i-1];
for(int i=1;i<=m;i++) {
que[i].id=i;
cin>>que[i].l>>que[i].r;
}
sort(que+1,que+m+1,cmp);
int l=0,r=0;
for(int i=1;i<=m;i++) {
int ql=que[i].l-1,qr=que[i].r;
while(l<ql) del(l++);
while(l>ql) add(--l);
while(r<qr) add(++r);
while(r>qr) del(r--);
ans[que[i].id]=sum;
}
for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
return 0;
}