#include <bits/stdc++.h>
using namespace std;
const int maxn = 1 << 20;
struct node {
  int l, r, id;
} Q[maxn];
int n, m, k, pos[maxn];
long long sum[maxn], cnt[maxn], ans[maxn];
bool cmp(node x, node y) {
  if (pos[x.l] == pos[y.l]) return pos[x.r] < pos[y.r];
  return pos[x.l] < pos[y.l];
}
int L = 1, R = 0;
long long Ans = 0;
void add(int x) {
  Ans += cnt[k ^ sum[x]];
  cnt[sum[x]]++;
}
void del(int x) {
  cnt[sum[x]]--;
  Ans -= cnt[k ^ sum[x]];
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  int sz = sqrt(n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &sum[i]);
    sum[i] ^= sum[i - 1];
    pos[i] = (i - 1) / sz + 1;
  }
  for (int i = 1; i <= m; i++) {
    int l, r;
    scanf("%d%d", &Q[i].l, &Q[i].r);
    Q[i].id = i;
  }
  sort(Q + 1, Q + 1 + m, cmp);
  cnt[0] = 1;
  for (int i = 1; i <= m; i++) {
    while (L < Q[i].l) {
      del(L - 1);
      L++;
    }
    while (L > Q[i].l) {
      L--;
      add(L - 1);
    }
    while (R < Q[i].r) {
      R++;
      add(R);
    }
    while (R > Q[i].r) {
      del(R);
      R--;
    }
    ans[Q[i].id] = Ans;
  }
  for (int i = 1; i <= m; i++) printf("%I64d\n", ans[i]);
  return 0;
}
