#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int size=257,otk=507,maxn=100500;
struct seniorious{
int num,rt;
}s[otk][maxn],*A,*B;
int pre[maxn],pos[maxn],a[maxn],ma[maxn],n,m,be[maxn],op,l,r,v,p,q,ans,lz[maxn];
inline int get(int x){
while(x^pre[x]){
x=pre[x]=pre[pre[x]];
}
return x;
}
inline void push(int x){
for(register int i=x*size-size+1;i<=x*size;i++){
a[i]=pos[get(i)];
s[x][a[i]].rt=s[x][a[i]].num=0;
a[i]-=lz[x];
}
for(register int i=x*size-size+1;i<=x*size;i++){
pre[i]=0;
}
lz[x]=0;
}
inline void reb(int x){
ma[x]=0;
for(register int i=x*size-size+1;i<=x*size;i++){
if(a[i]>ma[x]){
ma[x]=a[i];
}
s[x][a[i]].rt?pre[i]=s[x][a[i]].rt:(pos[i]=a[i],s[x][a[i]].rt=i,pre[i]=i);
s[x][a[i]].num++;
}
}
void play(int x,int a,int b){
A=&s[x][a];
B=&s[x][b];
B->rt?pre[A->rt]=B->rt:(B->rt=A->rt,pos[A->rt]=b);
B->num+=A->num;
A->num=A->rt=0;
}
inline void det(int x,int v){
int &p=lz[x],&q=ma[x];
if((v<<1)<=q-p){
for(register int i=p+1;i<=p+v;i++){
if(s[x][i].rt){
play(x,i,i+v);
}
}
p+=v;
}
else{
for(register int i=q;i>p+v;i--){
if(s[x][i].rt){
play(x,i,i-v);
}
}
q=std::min(q,p+v);
}
}
signed main(){
std::ios::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>n>>m;
for(register int i=1;i<=n;i++){
std::cin>>a[i];
be[i]=(i-1)/size+1;
}
for(register int i=1;i<=be[n];i++){
reb(i);
}
while(m--){
std::cin>>op>>l>>r>>v;
switch(op){
case 1:
p=be[l];
q=be[r];
if(p^q){
push(p);
push(q);
for(register int i=l;i<=p*size;i++){
if(a[i]>v){
a[i]-=v;
}
}
for(register int i=q*size-size+1;i<=r;i++){
if(a[i]>v){
a[i]-=v;
}
}
for(int i=p+1;i<q;i++){
det(i,v);
}
reb(p);
reb(q);
}
else{
push(p);
for(register int i=l;i<=r;i++){
if(a[i]>v){
a[i]-=v;
}
}
reb(p);
}
break;
case 2:
p=be[l];
q=be[r];
ans=0;
if(p^q){
for(register int i=l;i<=p*size;i++){
if(pos[get(i)]-lz[p]==v){
ans++;
}
}
for(register int i=q*size-size+1;i<=r;i++){
if(pos[get(i)]-lz[q]==v){
ans++;
}
}
for(register int i=p+1;i<q;i++){
if(v+lz[i]<maxn){
ans+=s[i][v+lz[i]].num;
}
}
}
else{
for(register int i=l;i<=r;i++){
if(pos[get(i)]-lz[p]==v){
ans++;
}
}
}
std::cout<<ans<<'\n';
break;
}
}
}
WA