#include <bits/stdc++.h>
using namespace std;
int A[100000 + 400];
int belong[100000 + 400];
int N, M;
int L(int x) { return x * 2 - 2 + 1; }
int R(int x) { return x * 2; }
struct DSU {
  int root[100000 + 400];
  int sz[100000 + 400];
  void init() {
    memset(root, 0, sizeof(root));
    memset(sz, 0, sizeof(sz));
  }
  int fi(int nod) {
    if (!root[nod]) {
      return nod;
    }
    return root[nod] = fi(root[nod]);
  }
  void u(int x, int y) {
    x = fi(x);
    y = fi(y);
    if (x != y) {
      root[x] = y;
      sz[y] += sz[x];
    }
  }
  int sze(int x) {
    x = fi(x);
    return sz[x];
  }
};
struct bucket {
  DSU F;
  int off;
  int maxval;
  void init() {
    F.init();
    off = 0;
    maxval = 0;
  }
  void update(int val) {
    F.sz[val]++;
    maxval = max(val, maxval);
  }
  void modify(int v) {
    if (2 * v <= maxval) {
      for (int i = 1; i <= v; i++) {
        F.u(i, i + v);
      }
      off += v;
      maxval -= v;
    } else {
      for (int i = v + 1; i <= maxval; i++) {
        F.u(i - v, i);
      }
    }
  }
  int q(int v) {
    if (v + off >= 100000) {
      return 0;
    }
    return F.sze(v + off);
  }
} V[400];
void push(int p, int x, int l, int r) {
  for (int j = L(p); j <= R(p); j++) {
    if (l <= j && j <= r && V[p].F.fi(A[j]) - V[p].off >= x) {
      V[p].F.sz[V[p].F.fi(A[j])]--;
      A[j] -= x;
      V[p].F.sz[V[p].F.fi(A[j])]++;
    }
  }
}
int main() {
  cin >> N >> M;
  for (int i = 1; i <= N; i++) {
    cin >> A[i];
    belong[i] = (i - 1) / 2 + 1;
    V[belong[i]].init();
  }
  for (int i = 1; i <= N; i++) {
    V[belong[i]].update(A[i]);
  }
  for (int i = 1; i <= M; i++) {
    int op, l, r, x;
    cin >> op >> l >> r >> x;
    if (op == 1) {
      int p = belong[l];
      int q = belong[r];
      push(p, x, l, r);
      if (p != q) {
        push(q, x, l, r);
      }
      for (int j = p + 1; j <= q - 1; j++) {
        V[j].modify(x);
      }
    } else {
      int p = belong[l];
      int q = belong[r];
      int ans = 0;
      for (int j = L(p); j <= R(p); j++) {
        if (l <= j && j <= r && V[p].F.fi(A[j]) - V[p].off == x) {
          ans++;
        }
      }
      if (p != q) {
        for (int j = L(q); j <= R(q); j++) {
          if (l <= j && j <= r && V[p].F.fi(A[j]) - V[p].off == x) {
            ans++;
          }
        }
      }
      for (int j = p + 1; j <= q - 1; j++) {
        ans += V[j].q(x);
      }
      cout << ans << "\n";
    }
  }
  return 0;
}
