#include <bits/stdc++.h>
using namespace std;
long long arr[1048595], cnt_xor[1048595], cumxor[1048595];
long long l = 0, r = -1, sum, ans[1048595];
struct query {
  long long L, R, id;
} q[1048595];
bool cmp(query x, query y) {
  if (x.L / 600 != y.L / 600) {
    return x.L / 600 < y.L / 600;
  }
  return x.R < y.R;
}
long long N, Q, K;
void in_querys() {
  for (long long i = 0; i < Q; i++) {
    scanf("%lld", &q[i].L);
    scanf("%lld", &q[i].R);
    q[i].L--;
    q[i].id = i;
  }
  sort(q, q + Q, cmp);
}
void add(long long pos) {
  long long lagbe = cumxor[pos] ^ K;
  sum += cnt_xor[lagbe];
  cnt_xor[cumxor[pos]]++;
}
void del(long long pos) {
  long long lagbe = cumxor[pos] ^ K;
  cnt_xor[cumxor[pos]]--;
  sum -= cnt_xor[lagbe];
}
int main() {
  scanf("%lld", &N);
  scanf("%lld", &Q);
  scanf("%lld", &K);
  for (long long i = 1; i <= N; i++) {
    scanf("%lld", &arr[i]);
    cumxor[i] = cumxor[i - 1] ^ arr[i];
  }
  in_querys();
  for (long long i = 0; i < Q; i++) {
    while (l > q[i].L) add(--l);
    while (r < q[i].R) add(++r);
    while (l < q[i].L) del(l++);
    while (r > q[i].R) del(r--);
    ans[q[i].id] = sum;
  }
  for (long long i = 0; i < Q; i++) {
    printf("%lld\n", ans[i]);
  }
  return 0;
}
