#include <bits/stdc++.h>
using namespace std;
const int maxn = 108011;
int t, p, d;
int n, m, L;
bool vis[maxn];
long long ans[maxn << 2];
int lazy[maxn << 2];
long long a[maxn];
void build(int l, int r, int x) {
  int i;
  if (l == r) {
    ans[x] = a[l];
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, x << 1);
  build(m + 1, r, x << 1 | 1);
  ans[x] = min(ans[x << 1], ans[x << 1 | 1]);
}
void update(int l, int r, int x) {
  int mid = (l + r) >> 1;
  if (l == p && r == p) {
    ans[x] += d;
    return;
  }
  if (p <= mid) update(l, mid, x << 1);
  if (mid < p) update(mid + 1, r, x << 1 | 1);
  ans[x] = min(ans[x << 1], ans[x << 1 | 1]);
}
int query(int l, int r, int x) {
  int Ans = 0;
  if (ans[x] > L) {
    return 1;
  }
  if (l == r) return 0;
  int mid = (l + r) >> 1;
  if ((a[mid] > L) && (a[mid + 1] > L)) Ans -= 1;
  Ans += query(l, mid, x << 1);
  Ans += query(mid + 1, r, x << 1 | 1);
  return Ans;
}
int main() {
  cin >> n >> m >> L;
  int last = 0;
  int anss = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    if (a[i] > L && last <= L) {
      anss++;
    }
    if (a[i] > L) vis[i] = 1;
    last = a[i];
  }
  while (m--) {
    scanf("%d", &t);
    if (t) {
      scanf("%d%d", &p, &d);
      a[p] += d;
      if (a[p] > L && !vis[p]) {
        vis[p] = 1;
        anss++;
        if (a[p - 1] > L && a[p + 1] > L)
          anss -= 2;
        else if (a[p - 1] > L || a[p + 1] > L)
          anss--;
      }
    } else {
      printf("%d\n", anss);
    }
  }
}
