#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
namespace IO {
const int str = 1 << 20;
static char in_buf[str], *in_s, *in_t;
bool __ = 0;
__inline__ __attribute__((always_inline)) char gc() {
  return (in_s == in_t) &&
             (in_t = (in_s = in_buf) + fread(in_buf, 1, str, stdin)),
         in_s == in_t ? EOF : *in_s++;
}
__inline__ __attribute__((always_inline)) void in(string &ch) {
  ch.clear();
  if (__) return;
  register char c;
  while ((c = gc()) != EOF && isspace(c))
    ;
  if (c == EOF) {
    __ = 1;
    return;
  }
  ch += c;
  while ((c = gc()) != EOF && !isspace(c)) ch += c;
  if (c == EOF) __ = 1;
}
__inline__ __attribute__((always_inline)) void in(char &ch) {
  if (__) return;
  register char c;
  while ((c = gc()) != EOF && isspace(c))
    ;
  if (c == EOF)
    __ = 1;
  else
    ch = c;
}
__inline__ __attribute__((always_inline)) void in(char *ch) {
  *ch = '\0';
  if (__) return;
  register char c;
  while ((c = gc()) != EOF && isspace(c))
    ;
  if (c == EOF) {
    __ = 1;
    return;
  }
  *ch = c;
  ch++;
  while ((c = gc()) != EOF && !isspace(c)) *ch = c, ch++;
  if (c == EOF) __ = 1;
  *ch = '\0';
}
template <typename T>
__inline__ __attribute__((always_inline)) void in(T &x) {
  if (__) return;
  register char c = gc();
  bool f = 0;
  while (c != EOF && (c < '0' || c > '9')) f ^= (c == '-'), c = gc();
  if (c == EOF) {
    __ = 1;
    return;
  }
  x = 0;
  while (c != EOF && '0' <= c && c <= '9') x = x * 10 + c - 48, c = gc();
  if (c == EOF) __ = 1;
  if (f) x = -x;
}
template <typename T, typename... arr>
__inline__ __attribute__((always_inline)) void in(T &x, arr &...y) {
  in(x), in(y...);
}
const char ln = '\n';
static char out_buf[str], *out_s = out_buf, *out_t = out_buf + str;
__inline__ __attribute__((always_inline)) void flush() {
  fwrite(out_buf, 1, out_s - out_buf, stdout);
  out_s = out_buf;
}
__inline__ __attribute__((always_inline)) void pt(char c) {
  (out_s == out_t) ? (fwrite(out_s = out_buf, 1, str, stdout), *out_s++ = c)
                   : (*out_s++ = c);
}
__inline__ __attribute__((always_inline)) void out(const char *s) {
  while (*s) pt(*s++);
}
__inline__ __attribute__((always_inline)) void out(char *s) {
  while (*s) pt(*s++);
}
__inline__ __attribute__((always_inline)) void out(char c) { pt(c); }
__inline__ __attribute__((always_inline)) void out(string s) {
  for (int i = 0; s[i]; i++) pt(s[i]);
}
template <typename T>
__inline__ __attribute__((always_inline)) void out(T x) {
  if (!x) {
    pt('0');
    return;
  }
  if (x < 0) pt('-'), x = -x;
  char a[50], t = 0;
  while (x) a[t++] = x % 10, x /= 10;
  while (t--) pt(a[t] + '0');
}
template <typename T, typename... arr>
__inline__ __attribute__((always_inline)) void out(T x, arr &...y) {
  out(x), out(y...);
}
}  // namespace IO
using namespace IO;
int n, m, a[100001];
int main() {
  in(n), in(m);
  for (int i = 1; i <= n; i++) in(a[i]);
  while (m--) {
    int q, l, r, x;
    in(q), in(l), in(r), in(x);
    if (q == 1) {
      for (int i = l; i <= r; i++) a[i] -= (a[i] > x) * x;
    } else {
      int y = 0;
      for (int i = l; i <= r; i++) y += (a[i] == x);
      printf("%d\n", y);
    }
  }
  return 0;
}
