#include<bits/stdc++.h>
using namespace std;
int n,m,nm,b[100005],l[320],r[320],k,x,y,z,ans[100005];
long long c[320];
struct node
{
int id;
long long n;
bool k;
} a[100005];
bool operator<(node x,node y)
{
return x.n<y.n;
}
vector<node> aa[100005];
int read()
{
int result=0,k=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch=='-')
k=-1;
ch=getchar();
}
while ('0'<=ch && ch<='9')
{
result=result*10+(ch^48);
ch=getchar();
}
return k*result;
}
void write(int x)
{
if (x>=10)
write(x/10);
putchar(x%10|48);
}
int main()
{
memset(ans,-1,sizeof(ans));
n=read();
m=read();
++m;
nm=round(sqrt(m));
for (int i=1;i<=n;++i)
{
x=read();
aa[i].push_back((node){1,x,1});
aa[i+1].push_back((node){1,-x,1});
}
for (int i=1;i<=m;++i)
{
a[i].id=i;
b[i]=(i-1)/nm+1;
if (l[b[i]]==0)
l[b[i]]=i;
r[b[i]]=i;
}
for (int i=2;i<=m;++i)
{
k=read();
if (k==1)
{
x=read();
y=read();
z=read();
aa[x].push_back((node){i,z,1});
aa[y+1].push_back((node){i,-z,1});
}
else
{
x=read();
y=read();
aa[x].push_back((node){i-1,y,0});
}
}
for (int i=1;i<=n;++i)
for (node nd:aa[i])
if (nd.k)
{
for (int j=l[b[nd.id]];j<=r[b[nd.id]];++j)
if (a[j].id>=nd.id)
a[j].n+=nd.n;
sort(a+l[b[nd.id]],a+r[b[nd.id]]+1);
for (int j=b[nd.id]+1;j<=b[m];++j)
c[j]+=x;
}
else
{
ans[nd.id]=0;
for (int j=1;j<b[nd.id];++j)
ans[nd.id]+=r[j]-(lower_bound(a+l[j],a+r[j]+1,(node){0,nd.n-c[j],0})-a)+1;
for (int j=l[b[nd.id]];j<=r[b[nd.id]];++j)
if (a[j].id<=nd.id && a[j].n+c[b[j]]>=nd.n)
++ans[nd.id];
}
for (int i=1;i<m;++i)
if (ans[i]!=-1)
{
write(ans[i]);
putchar('\n');
}
}