#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int MAXT = 4 * MAXN;
static int N, M, X, A[MAXN];
static struct tNode {
  long long sum;
  vector<pair<int, int>> pre, suf;
} tree[MAXT];
inline tNode update(const tNode &x, const tNode &y) {
  if (!x.pre.size()) return y;
  if (!y.pre.size()) return x;
  tNode ans = {x.sum + y.sum, x.pre, y.suf};
  for (auto &i : x.suf)
    for (auto &j : y.pre)
      if ((i.first | j.first) >= X) ans.sum += 1ll * i.second * j.second;
  int l = x.pre.back().first, r = y.suf.back().first;
  for (auto &i : y.pre) {
    if ((i.first | l) == ans.pre.back().first)
      ans.pre.back().second += i.second;
    else
      ans.pre.emplace_back(pair<int, int>{i.first | l, i.second});
  }
  for (auto &i : x.suf) {
    if ((i.first | r) == ans.suf.back().first)
      ans.suf.back().second += i.second;
    else
      ans.suf.emplace_back(pair<int, int>{i.first | r, i.second});
  }
  return ans;
}
void build(int n, int l, int r) {
  tNode &tr = tree[n];
  if (l == r) {
    tr.sum = A[l] >= X;
    tr.pre.emplace_back(pair<int, int>{A[l], 1});
    tr.suf.emplace_back(pair<int, int>{A[l], 1});
    return;
  }
  build((n << 1), l, ((l + r) >> 1));
  build(((n << 1) | 1), (((l + r) >> 1) + 1), r);
  tr = update(tree[(n << 1)], tree[((n << 1) | 1)]);
}
void modify(int n, int l, int r, int p, int v) {
  tNode &tr = tree[n];
  if (l == r) {
    tr.sum = v >= X;
    tr.pre.clear();
    tr.suf.clear();
    tr.pre.emplace_back(pair<int, int>{v, 1});
    tr.suf.emplace_back(pair<int, int>{v, 1});
    return;
  }
  if (p <= ((l + r) >> 1))
    modify((n << 1), l, ((l + r) >> 1), p, v);
  else
    modify(((n << 1) | 1), (((l + r) >> 1) + 1), r, p, v);
  tr = update(tree[(n << 1)], tree[((n << 1) | 1)]);
}
tNode query(int n, int l, int r, int fl, int fr) {
  tNode &tr = tree[n];
  if (fl <= l && r <= fr) return tr;
  tNode ans = {0, decltype(ans.pre)(), decltype(ans.suf)()};
  if (fl <= ((l + r) >> 1))
    ans = update(ans, query((n << 1), l, ((l + r) >> 1), fl, fr));
  if (fr >= (((l + r) >> 1) + 1))
    ans = update(ans, query(((n << 1) | 1), (((l + r) >> 1) + 1), r, fl, fr));
  return ans;
}
int main() {
  scanf("%d%d%d", &N, &M, &X);
  for (int i = 1; i <= N; i++) scanf("%d", &A[i]);
  build(1, 1, N);
  while (M--) {
    int op, x, y;
    scanf("%d%d%d", &op, &x, &y);
    if (op == 1)
      modify(1, 1, N, x, y);
    else
      printf("%lld\n", query(1, 1, N, x, y).sum);
  }
  return 0;
}
