#include <bits/stdc++.h>
using namespace std;
struct Block {
int L, R;
vector<int> a;
vector<int> parent, cnt;
int maxVal;
Block() {}
Block(int l, int r, const vector<int>& src) {
L = l; R = r;
a.assign(src.begin()+l, src.begin()+r+1);
maxVal = *max_element(a.begin(), a.end());
parent.assign(maxVal+1, 0);
cnt.assign(maxVal+1, 0);
iota(parent.begin(), parent.end(), 0);
for (int v : a) cnt[v]++;
}
int find(int x) {
if (x > maxVal) return -1;
if (parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
void mergeVal(int u, int v) {
u = find(u); v = find(v);
if (u == -1 || v == -1) return;
if (u == v) return;
parent[u] = v;
cnt[v] += cnt[u];
cnt[u] = 0;
}
void rebuild(const vector<int>& src) {
a.assign(src.begin()+L, src.begin()+R+1);
maxVal = *max_element(a.begin(), a.end());
parent.resize(maxVal+1);
cnt.assign(maxVal+1,0);
iota(parent.begin(), parent.end(), 0);
for (int v : a) cnt[v]++;
}
void updatePart(vector<int>& src, int l, int r, int x) {
for (int i=l;i<=r;i++) {
if (src[i] > x) src[i] -= x;
}
rebuild(src);
}
void updateFull(int x) {
for (int v=x+1; v<=maxVal; v++) {
int u = find(v);
if (u> x) mergeVal(u, u-x);
}
maxVal = x;
}
int queryPart(vector<int>& src, int l, int r, int x) {
int res=0;
for (int i=l;i<=r;i++) if (src[i]==x) res++;
return res;
}
int queryFull(int x) {
if (x>maxVal) return 0;
return cnt[find(x)];
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m; cin>>n>>m;
vector<int> a(n);
for (int i=0;i<n;i++) cin>>a[i];
int B = sqrt(n)+1;
vector<Block> blocks;
for (int i=0;i<n;i+=B) {
int j=min(n-1,i+B-1);
blocks.emplace_back(i,j,a);
}
while (m--) {
int t,l,r,x; cin>>t>>l>>r>>x; l--; r--;
int bl=l/B, br=r/B;
if (t==1) {
if (bl==br) {
blocks[bl].updatePart(a,l,r,x);
} else {
blocks[bl].updatePart(a,l,blocks[bl].R,x);
blocks[br].updatePart(a,blocks[br].L,r,x);
for (int i=bl+1;i<br;i++) blocks[i].updateFull(x);
}
} else {
long long ans=0;
if (bl==br) {
ans+=blocks[bl].queryPart(a,l,r,x);
} else {
ans+=blocks[bl].queryPart(a,l,blocks[bl].R,x);
ans+=blocks[br].queryPart(a,blocks[br].L,r,x);
for (int i=bl+1;i<br;i++) ans+=blocks[i].queryFull(x);
}
cout<<ans<<"\n";
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgQmxvY2sgewogICAgaW50IEwsIFI7CiAgICB2ZWN0b3I8aW50PiBhOwogICAgdmVjdG9yPGludD4gcGFyZW50LCBjbnQ7CiAgICBpbnQgbWF4VmFsOwogICAgQmxvY2soKSB7fQogICAgQmxvY2soaW50IGwsIGludCByLCBjb25zdCB2ZWN0b3I8aW50PiYgc3JjKSB7CiAgICAgICAgTCA9IGw7IFIgPSByOwogICAgICAgIGEuYXNzaWduKHNyYy5iZWdpbigpK2wsIHNyYy5iZWdpbigpK3IrMSk7CiAgICAgICAgbWF4VmFsID0gKm1heF9lbGVtZW50KGEuYmVnaW4oKSwgYS5lbmQoKSk7CiAgICAgICAgcGFyZW50LmFzc2lnbihtYXhWYWwrMSwgMCk7CiAgICAgICAgY250LmFzc2lnbihtYXhWYWwrMSwgMCk7CiAgICAgICAgaW90YShwYXJlbnQuYmVnaW4oKSwgcGFyZW50LmVuZCgpLCAwKTsKICAgICAgICBmb3IgKGludCB2IDogYSkgY250W3ZdKys7CiAgICB9CiAgICBpbnQgZmluZChpbnQgeCkgewogICAgICAgIGlmICh4ID4gbWF4VmFsKSByZXR1cm4gLTE7CiAgICAgICAgaWYgKHBhcmVudFt4XSA9PSB4KSByZXR1cm4geDsKICAgICAgICByZXR1cm4gcGFyZW50W3hdID0gZmluZChwYXJlbnRbeF0pOwogICAgfQogICAgdm9pZCBtZXJnZVZhbChpbnQgdSwgaW50IHYpIHsKICAgICAgICB1ID0gZmluZCh1KTsgdiA9IGZpbmQodik7CiAgICAgICAgaWYgKHUgPT0gLTEgfHwgdiA9PSAtMSkgcmV0dXJuOwogICAgICAgIGlmICh1ID09IHYpIHJldHVybjsKICAgICAgICBwYXJlbnRbdV0gPSB2OwogICAgICAgIGNudFt2XSArPSBjbnRbdV07CiAgICAgICAgY250W3VdID0gMDsKICAgIH0KICAgIHZvaWQgcmVidWlsZChjb25zdCB2ZWN0b3I8aW50PiYgc3JjKSB7CiAgICAgICAgYS5hc3NpZ24oc3JjLmJlZ2luKCkrTCwgc3JjLmJlZ2luKCkrUisxKTsKICAgICAgICBtYXhWYWwgPSAqbWF4X2VsZW1lbnQoYS5iZWdpbigpLCBhLmVuZCgpKTsKICAgICAgICBwYXJlbnQucmVzaXplKG1heFZhbCsxKTsKICAgICAgICBjbnQuYXNzaWduKG1heFZhbCsxLDApOwogICAgICAgIGlvdGEocGFyZW50LmJlZ2luKCksIHBhcmVudC5lbmQoKSwgMCk7CiAgICAgICAgZm9yIChpbnQgdiA6IGEpIGNudFt2XSsrOwogICAgfQogICAgdm9pZCB1cGRhdGVQYXJ0KHZlY3RvcjxpbnQ+JiBzcmMsIGludCBsLCBpbnQgciwgaW50IHgpIHsKICAgICAgICBmb3IgKGludCBpPWw7aTw9cjtpKyspIHsKICAgICAgICAgICAgaWYgKHNyY1tpXSA+IHgpIHNyY1tpXSAtPSB4OwogICAgICAgIH0KICAgICAgICByZWJ1aWxkKHNyYyk7CiAgICB9CiAgICB2b2lkIHVwZGF0ZUZ1bGwoaW50IHgpIHsKICAgICAgICBmb3IgKGludCB2PXgrMTsgdjw9bWF4VmFsOyB2KyspIHsKICAgICAgICAgICAgaW50IHUgPSBmaW5kKHYpOwogICAgICAgICAgICBpZiAodT4geCkgbWVyZ2VWYWwodSwgdS14KTsKICAgICAgICB9CiAgICAgICAgbWF4VmFsID0geDsKICAgIH0KICAgIGludCBxdWVyeVBhcnQodmVjdG9yPGludD4mIHNyYywgaW50IGwsIGludCByLCBpbnQgeCkgewogICAgICAgIGludCByZXM9MDsKICAgICAgICBmb3IgKGludCBpPWw7aTw9cjtpKyspIGlmIChzcmNbaV09PXgpIHJlcysrOwogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICBpbnQgcXVlcnlGdWxsKGludCB4KSB7CiAgICAgICAgaWYgKHg+bWF4VmFsKSByZXR1cm4gMDsKICAgICAgICByZXR1cm4gY250W2ZpbmQoeCldOwogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgaW50IG4sbTsgY2luPj5uPj5tOwogICAgdmVjdG9yPGludD4gYShuKTsKICAgIGZvciAoaW50IGk9MDtpPG47aSsrKSBjaW4+PmFbaV07CiAgICBpbnQgQiA9IHNxcnQobikrMTsKICAgIHZlY3RvcjxCbG9jaz4gYmxvY2tzOwogICAgZm9yIChpbnQgaT0wO2k8bjtpKz1CKSB7CiAgICAgICAgaW50IGo9bWluKG4tMSxpK0ItMSk7CiAgICAgICAgYmxvY2tzLmVtcGxhY2VfYmFjayhpLGosYSk7CiAgICB9CiAgICB3aGlsZSAobS0tKSB7CiAgICAgICAgaW50IHQsbCxyLHg7IGNpbj4+dD4+bD4+cj4+eDsgbC0tOyByLS07CiAgICAgICAgaW50IGJsPWwvQiwgYnI9ci9COwogICAgICAgIGlmICh0PT0xKSB7CiAgICAgICAgICAgIGlmIChibD09YnIpIHsKICAgICAgICAgICAgICAgIGJsb2Nrc1tibF0udXBkYXRlUGFydChhLGwscix4KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJsb2Nrc1tibF0udXBkYXRlUGFydChhLGwsYmxvY2tzW2JsXS5SLHgpOwogICAgICAgICAgICAgICAgYmxvY2tzW2JyXS51cGRhdGVQYXJ0KGEsYmxvY2tzW2JyXS5MLHIseCk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpPWJsKzE7aTxicjtpKyspIGJsb2Nrc1tpXS51cGRhdGVGdWxsKHgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZyBsb25nIGFucz0wOwogICAgICAgICAgICBpZiAoYmw9PWJyKSB7CiAgICAgICAgICAgICAgICBhbnMrPWJsb2Nrc1tibF0ucXVlcnlQYXJ0KGEsbCxyLHgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYW5zKz1ibG9ja3NbYmxdLnF1ZXJ5UGFydChhLGwsYmxvY2tzW2JsXS5SLHgpOwogICAgICAgICAgICAgICAgYW5zKz1ibG9ja3NbYnJdLnF1ZXJ5UGFydChhLGJsb2Nrc1ticl0uTCxyLHgpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaT1ibCsxO2k8YnI7aSsrKSBhbnMrPWJsb2Nrc1tpXS5xdWVyeUZ1bGwoeCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291dDw8YW5zPDwiXG4iOwogICAgICAgIH0KICAgIH0KfQo=