#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, q, X, a[N];
struct node {
  long long ans;
  int l, r;
  vector<pair<int, int> > prf, suf;
  node() {
    l = r = -1, ans = 0LL;
    prf.clear(), suf.clear();
  };
};
node operator+(const node& x, const node& y) {
  if (x.l == -1) return y;
  if (y.l == -1) return x;
  node res = node();
  res.l = x.l, res.r = y.r;
  res.ans = x.ans + y.ans;
  res.prf = x.prf;
  res.suf = y.suf;
  for (auto i : y.prf) {
    if ((res.prf.back().first | i.first) != res.prf.back().first)
      res.prf.push_back(
          pair<int, int>(res.prf.back().first | i.first, i.second));
  }
  for (auto i : x.suf) {
    if ((res.suf.back().first | i.first) != res.suf.back().first)
      res.suf.push_back(
          pair<int, int>(res.suf.back().first | i.first, i.second));
  }
  int ptr = y.prf.size() - 1;
  for (int i = 0; i < x.suf.size(); i++) {
    while (ptr >= 0 && (x.suf[i].first | y.prf[ptr].first) >= X) ptr--;
    int len = 0, len2 = 0;
    if (i < (int)x.suf.size() - 1)
      len = x.suf[i].second - x.suf[i + 1].second;
    else
      len = x.suf[i].second - res.l + 1;
    if (ptr < (int)y.prf.size() - 1) len2 = res.r + 1 - y.prf[ptr + 1].second;
    res.ans += 1LL * len * len2;
  }
  return res;
}
struct SegmentTree {
  node t[N << 2];
  void build(int l, int r, int x) {
    if (l == r) {
      t[x] = node();
      t[x].l = t[x].r = l;
      t[x].ans = (a[l] >= X);
      t[x].prf.push_back(pair<int, int>(a[l], l)),
          t[x].suf.push_back(pair<int, int>(a[l], l));
      return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, x << 1);
    build(mid + 1, r, x << 1 | 1);
    t[x] = t[x << 1] + t[x << 1 | 1];
  }
  void update(int l, int r, int pos, int x) {
    if (l == r) {
      t[x] = node();
      t[x].l = t[x].r = l;
      t[x].ans = (a[l] >= X);
      t[x].prf.push_back(pair<int, int>(a[l], l)),
          t[x].suf.push_back(pair<int, int>(a[l], l));
      return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid)
      update(l, mid, pos, x << 1);
    else
      update(mid + 1, r, pos, x << 1 | 1);
    t[x] = t[x << 1] + t[x << 1 | 1];
  }
  node get(int l, int r, int s, int e, int x) {
    if (l > r || l > e || r < s) return node();
    if (s <= l && r <= e) return t[x];
    int mid = (l + r) >> 1;
    return get(l, mid, s, e, x << 1) + get(mid + 1, r, s, e, x << 1 | 1);
  }
} st;
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q >> X;
  for (int i = 0; i < n; i++) cin >> a[i];
  st.build(0, n - 1, 1);
  while (q--) {
    int op, val1, val2;
    cin >> op >> val1 >> val2;
    if (op == 1) {
      val1--;
      a[val1] = val2;
      st.update(0, n - 1, val1, 1);
    } else {
      val1--, val2--;
      cout << st.get(0, n - 1, val1, val2, 1).ans << "\n";
    }
  }
  return 0;
}
