#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100005;
inline int read();
int n,m,k,a[N],pos[N],lef,righ,res,cnt,yh[N],num[N*2];
struct node {
int l,r,ans,ID;
}q[N];
bool cmp(node x,node y){
return x.ID<y.ID;
}
bool cm(node x,node y){
return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
}
inline void add(int w){
res+=num[yh[w]^k];++num[yh[w]];
}
inline void sub(int w){
--num[yh[w]];res-=num[yh[w]^k];
}
signed main()
{
n=read();m=read();k=read();
cnt=sqrt(n);
for(int i=1;i<=n;++i) {
a[i]=read();
pos[i]=(i-1)/cnt+1;
yh[i]=a[i-1]^a[i];
}
for(int i=1;i<=m;++i)
{
q[i].l=read();q[i].r=read();q[i].l--;
q[i].ID=i;
}
sort(q+1,q+1+m,cm);
lef=1;righ=0;res=0;
for(int i=1;i<=m;++i)
{
while(q[i].l<lef) add(--lef);
while(q[i].r>righ) add(++righ);
while(q[i].l>lef) sub(lef++);
while(q[i].r<righ) sub(righ--);
q[i].ans=res;
}
sort(q+1,q+1+m,cmp);
for(int i=1;i<=m;++i) printf("%lld\n",q[i].ans);
return 0;
}
inline int read(){
int x=0;int b=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') b=-1;
c=getchar();
}
while(isdigit(c)){
x=x*10+c-'0';
c=getchar();
}
return x*b;
}