#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int block,pos[N],A[N],k,ans,B[N],ANS[N];
struct Query{
int l,r,id;
bool operator <(const Query a) const{
return(pos[l]<pos[a.l])||(pos[l]==pos[a.l]&&(pos[l]&1?r<a.r:r>a.r));
}
}Q[N];
void add(int x){
int y=A[x]^k;
ans+=B[y];
B[A[x]]++;
}
void del(int x){
int y=A[x]^k;
ans-=B[y];
B[A[x]]--;
}
int main(){
int n,m;
scanf("%d%d%d",&n,&m,&k);
block=sqrt(n);
for(int i=2;i<=n+1;++i)scanf("%d",&A[i]),A[i]^=A[i-1],pos[i]=i/block;
for(int i=1;i<=m;++i)scanf("%d%d",&Q[i].l,&Q[i].r),Q[i].id=i,Q[i].r++;
sort(Q+1,Q+1+m);
int l=1,r=0;
for(int i=1;i<=m;++i){
while(l>Q[i].l)l--,add(l);
while(r<Q[i].r)++r,add(r);
while(l<Q[i].l)del(l),++l;
while(r>Q[i].r)del(r),--r;
ANS[Q[i].id]=ans;
}
for(int i=1;i<=m;++i)printf("%d\n",ANS[i]);
}