#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c-'0');
c=getchar();
}
return x;
}
inline void write(int x)
{
if(x>9)
write(x/10);
putchar(x%10+'0');
}
const int N=100010;
int n,m;
int a[N];
int tl[320],tr[320],tmax[320],jian[320],td[N];
int q,idx;
void build(int l,int r)
{
idx++;
tl[idx]=l,tr[idx]=r;
for(int i=l;i<=r;i++)
tmax[idx]=max(tmax[idx],a[i]),td[i]=idx;
if(r==n)
return ;
build(l+q,min(r+q,n));
}
int p,l,r,x,ans;
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
q=sqrt(n);
build(1,q);
while(m--)
{
p=read(),l=read(),r=read(),x=read();
int st=td[l],ed=td[r];
if(p==1)
{
if(ed-st<=1)
{
for(int i=l;i<=r;i++)
if(a[i]>x)
a[i]-=x;
tmax[st]=0;
for(int i=tl[st];i<=tr[st];i++)
tmax[st]=max(tmax[st],a[i]);
if(st!=ed)
{
tmax[ed]=0;
for(int i=tl[ed];i<=tr[ed];i++)
tmax[ed]=max(tmax[ed],a[i]);
}
}
else
{
for(int i=l;i<=tr[st];i++)
if(a[i]>x)
a[i]-=x;
tmax[st]=0;
for(int i=tl[st];i<=tr[st];i++)
tmax[st]=max(tmax[st],a[i]);
for(int i=tl[ed];i<=r;i++)
if(a[i]>x)
a[i]-=x;
tmax[ed]=0;
for(int i=tl[ed];i<=tr[ed];i++)
tmax[ed]=max(tmax[ed],a[i]);
for(int i=st+1;i<=ed-1;i++)
if(tmax[i]-jian[i]>x)
{
for(int j=tl[i];j<=tr[j];j++)
if(a[j]>jian[i])
a[j]-=jian[i];
tmax[i]=0;
for(int j=tl[i];j<=tr[i];j++)
tmax[i]=max(tmax[i],a[j]);
jian[i]=x;
}
}
}
else
{
ans=0;
if(ed-st<=1)
{
if(jian[st])
{
for(int i=tl[st];i<=tr[st];i++)
if(a[i]>jian[st])
a[i]-=jian[st];
tmax[st]=0;
for(int i=tl[st];i<=tr[st];i++)
tmax[st]=max(tmax[st],a[i]);
jian[st]=0;
}
if(jian[ed])
{
for(int i=tl[ed];i<=tr[ed];i++)
if(a[i]>jian[ed])
a[i]-=jian[ed];
tmax[ed]=0;
for(int i=tl[ed];i<=tr[ed];i++)
tmax[ed]=max(tmax[ed],a[i]);
jian[ed]=0;
}
for(int i=l;i<=r;i++)
if(a[i]==x)
ans++;
}
else
{
if(jian[st])
{
for(int i=tl[st];i<=tr[st];i++)
if(a[i]>jian[st])
a[i]-=jian[st];
tmax[st]=0;
for(int i=tl[st];i<=tr[st];i++)
tmax[st]=max(tmax[st],a[i]);
jian[st]=0;
}
if(jian[ed])
{
for(int i=tl[ed];i<=tr[ed];i++)
if(a[i]>jian[ed])
a[i]-=jian[ed];
tmax[ed]=0;
for(int i=tl[ed];i<=tr[ed];i++)
tmax[ed]=max(tmax[ed],a[i]);
jian[ed]=0;
}
for(int i=l;i<=tr[st];i++)
if(a[i]==x)
ans++;
for(int i=tl[ed];i<=r;i++)
if(a[i]==x)
ans++;
for(int i=st+1;i<ed;i++)
{
if(tmax[i]-jian[i]<x)
continue;
if(jian[i])
{
for(int j=tl[i];j<=tr[i];j++)
if(a[j]>jian[i])
a[j]-=jian[i];
tmax[i]=0;
for(int j=tl[i];j<=tr[i];j++)
tmax[i]=max(tmax[i],a[j]);
jian[i]=0;
}
for(int j=tl[i];j<=tr[i];j++)
if(a[j]==x)
ans++;
}
}
write(ans);
puts("");
}
}
return 0;
}