#include<bits/stdc++.h>
#define rep(i, j, k) for(int i=j; i<k; i++)
#define ll long long
using namespace std;
const int maxn =1<<20;
struct node{
int l, r, id;
}Q[maxn];
int pos[maxn];
ll ans[maxn];
ll flag[maxn];
int a[maxn];
bool cmp(node a, node b){
return pos[a.l]<pos[b.l] || pos[a.l] == pos[b.l] && a.r < b.r;
}
int n,m,k; int L=1, R=0; ll Ans=0;
void add(int x){
Ans+=flag[a[x]^k];
flag[a[x]]++;
}
void del(int x){
flag[a[x]]--;//必须先--
Ans-=flag[a[x]^k];
}
int main(){
scanf("%d%d%d", &n, &m, &k);
int sz = sqrt(n);
rep(i, 1, n+1){
scanf("%d", &a[i]);
a[i] = a[i]^a[i-1];
pos[i] = i/sz;
}
rep(i, 0, m){
scanf("%d%d", &Q[i].l, &Q[i].r);
Q[i].id = i;
}
sort(Q, Q+m, cmp);
flag[0] = 1;
rep(i, 0, m){
while (L<Q[i].l){
del(L-1);
L++;
}
while (L>Q[i].l){
L--;
add(L-1);
}
while (R>Q[i].r){
del(R);
R--;
}
while (R<Q[i].r){
R++;
add(R);
}
ans[Q[i].id] = Ans;
}
rep(i, 0 ,m){
cout<<ans[i]<<endl;
}
}