#include <bits/stdc++.h>
using namespace std;
int n, q, m, b[1000000];
struct arr {
  int x, y;
};
struct stp {
  long long ans, l, r;
  vector<arr> pre, suf;
} z;
struct segment_tree {
  stp a[1000000];
  stp merge(stp x, stp y) {
    z.l = x.l, z.r = y.r;
    z.ans = x.ans + y.ans;
    for (int i = 0, j = x.suf.size(); i < y.pre.size(); i++) {
      while (j && (x.suf[j - 1].y | y.pre[i].y) >= m) --j;
      if (j != x.suf.size())
        z.ans +=
            (x.suf[j].x - x.l + 1) *
            ((i + 1 < y.pre.size() ? y.pre[i + 1].x : y.r + 1) - y.pre[i].x);
    }
    z.pre = x.pre;
    for (int i = 0; i < y.pre.size(); i++)
      if ((z.pre.back().y | y.pre[i].y) != z.pre.back().y)
        z.pre.push_back({y.pre[i].x, z.pre.back().y | y.pre[i].y});
    z.suf = y.suf;
    for (int i = 0; i < x.suf.size(); i++)
      if ((z.suf.back().y | x.suf[i].y) != z.suf.back().y)
        z.suf.push_back({x.suf[i].x, z.suf.back().y | x.suf[i].y});
    return z;
  }
  void build(int l, int r, int k) {
    a[k].l = l, a[k].r = r;
    if (l == r) {
      a[k].ans = b[l] >= m;
      a[k].pre.push_back({l, b[l]});
      a[k].suf.push_back({l, b[l]});
      return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, k << 1);
    build(mid + 1, r, (k << 1) | 1);
    a[k] = merge(a[k << 1], a[(k << 1) | 1]);
  }
  void update(int l, int r, int k, int x, int y) {
    if (l == r) {
      a[k].ans = y >= m;
      a[k].pre[0] = {l, y};
      a[k].suf[0] = {l, y};
      return;
    }
    int mid = (l + r) >> 1;
    if (x <= mid) update(l, mid, k << 1, x, y);
    if (x > mid) update(mid + 1, r, (k << 1) | 1, x, y);
    a[k] = merge(a[k << 1], a[(k << 1) | 1]);
  }
  stp find(int l, int r, int k, int x, int y) {
    if (l >= x && r <= y) return a[k];
    int mid = (l + r) >> 1;
    if (y <= mid) return find(l, mid, k << 1, x, y);
    if (x > mid) return find(mid + 1, r, (k << 1) | 1, x, y);
    return merge(find(l, mid, k << 1, x, y),
                 find(mid + 1, r, (k << 1) | 1, x, y));
  }
} st;
int main() {
  scanf("%d%d%d", &n, &q, &m);
  for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
  st.build(1, n, 1);
  for (int i = 1; i <= q; i++) {
    int bo, x, y;
    scanf("%d%d%d", &bo, &x, &y);
    if (bo & 1)
      st.update(1, n, 1, x, y);
    else
      printf("%lld\n", st.find(1, n, 1, x, y).ans);
  }
}
