#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+100,M=2e6+100;
int n,m,k,p[N],block;
ll c[M],cnt,ans[N],a[N];
struct node
{
int x,y,id;
}q[N];
void build()
{
block=sqrt(n);
for(int i=1;i<=n;i++) p[i]=(i-1)/block+1;
}
bool cmp(node a1,node a2)
{
if(p[a1.id]!=p[a2.id]) return p[a1.id]<p[a2.id];
if(p[a1.id]%2==1) return a1.y>a2.y;
else return a1.y<a2.y;
}
void add(int mst)
{
cnt+=c[a[mst]^k];
c[a[mst]]++;
}
void del(int mst)
{
c[a[mst]]--;
cnt-=c[a[mst]^k];
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
a[i]^=a[i-1];
}
build();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].x,&q[i].y);
q[i].x--,q[i].id=i;
}
sort(q+1,q+m+1,cmp);
for(int i=1,l=1,r=0;i<=m;i++)
{
while(l<q[i].x) del(l++);
while(r>q[i].y) del(r--);
while(l>q[i].x) add(--l);
while(r<q[i].y) add(++r);
ans[q[i].id]=cnt;
}
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}