#include <bits/stdc++.h>
using namespace std;
int n, m, k, x, L, R;
int sum[2000001];
long long A[100005];
int s[100005];
long long ans;
struct query {
  int l, r, k;
} q[100005];
bool cmp(query q1, query q2) {
  if (q1.l / 316 == q2.l / 316)
    return q1.r < q2.r;
  else
    return q1.l / 316 < q2.l / 316;
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    s[i] = s[i - 1] ^ x;
  }
  for (int i = 1; i <= m; i++) scanf("%d%d", &q[i].l, &q[i].r), q[i].k = i;
  for (int i = 1; i <= m; i++) q[i].l--;
  sort(q + 1, q + 1 + m, cmp);
  for (int i = q[1].l; i <= q[1].r; i++) {
    ans += sum[k ^ s[i]];
    sum[s[i]]++;
  }
  A[q[1].k] = ans;
  L = q[1].l;
  R = q[1].r;
  for (int i = 2; i <= m; i++) {
    while (L > q[i].l) {
      L--;
      ans += sum[k ^ s[L]];
      sum[s[L]]++;
    }
    while (R < q[i].r) {
      R++;
      ans += sum[k ^ s[R]];
      sum[s[R]]++;
    }
    while (L < q[i].l) {
      sum[s[L]]--;
      ans -= sum[k ^ s[L]];
      L++;
    }
    while (R > q[i].r) {
      sum[s[R]]--;
      ans -= sum[k ^ s[R]];
      R--;
    }
    A[q[i].k] = ans;
  }
  for (int i = 1; i <= m; i++) printf("%I64d\n", A[i]);
}
