#include <bits/stdc++.h>
using namespace std;
int prefix[100001], n, m, k, temp, l, r;
long long res, cnt[1 << 20] = {1}, ans[100001];
struct node {
  int L, R, ind;
} q[100001];
bool comp(node a, node b) {
  if (a.L / 340 != b.L / 340)
    return a.L / 340 < b.L / 340;
  else
    return (a.R < b.R);
}
void add(int val) {
  res += cnt[k ^ val];
  ++cnt[val];
}
void remove(int val) {
  --cnt[val];
  res -= cnt[k ^ val];
}
int main() {
  cin >> n >> m >> k;
  for (int i = 1; i < n + 1; ++i) {
    scanf("%d", &prefix[i]);
    prefix[i] ^= prefix[i - 1];
  }
  for (int i = 0; i < m; ++i) {
    scanf("%d%d", &q[i].L, &q[i].R);
    --q[i].L, q[i].R++;
    q[i].ind = i;
  }
  sort(q, q + m, comp);
  l = -1, r = 0;
  for (int i = 0; i < m; ++i) {
    while (l < q[i].L) remove(prefix[l++]);
    while (l > q[i].L) add(prefix[--l]);
    while (r > q[i].R) remove(prefix[--r]);
    while (r < q[i].R) add(prefix[r++]);
    ans[q[i].ind] = res;
  }
  for (int i = 0; i < m; ++i) printf("%I64d\n", ans[i]);
}
