#include<bits/stdc++.h>
using namespace std;
#define int long long
#define Max 100010
struct Add{
int x,y;
int time;
}ad[Max<<1];
struct Find{
int x,y;
int time;
int index;
}fi[Max];
int cnt1,cnt2;
int ans[Max];
int cost[Max];
int n,m;
int block[Max];
int bll[Max],blr[Max];
int addx[Max];
int ts[Max],fs[Max];
int size;
inline bool cmp_add(Add a,Add b){
return a.x!=b.x?a.x<b.x:a.time<b.time;
}
inline bool cmp_find(Find a,Find b){
return a.x!=b.x?a.x<b.x:a.time<b.time;
}
inline bool cmp(int a,int b){
return a>b;
}
inline void resort(int x){
for(int i=bll[x];i<=blr[i];i++){
fs[i]=ts[i];
}
std::sort(fs+bll[x],fs+blr[x]+1,cmp);
return;
}
inline void change(int l,int r,int w){
l=std::max(l,0ll);
r=std::min(r,m);
if(block[l]==block[r]){
for(register int i=l;i<=r;i++){
ts[i]+=w;
}
resort(block[l]);
return;
}
for(register int i=l;i<=blr[block[l]];i++){
ts[i]+=w;
}
resort(block[l]);
for(register int i=r;i>=bll[block[r]];i--){
ts[i]+=w;
}
resort(block[r]);
for(register int i=block[l]+1;i<=block[r]-1;i++){
addx[i]+=w;
}
return;
}
inline int query(int l,int r,int w){
int cnt=0;
if(block[l]==block[r]){
for(register int i=l;i<=r;i++){
if(ts[i]+addx[block[i]]>=w){
cnt++;
}
}
return cnt;
}
for(register int i=l;i<=blr[block[l]];i++){
if(ts[i]+addx[block[i]]>=w){
cnt++;
}
}
for(register int i=r;i>=bll[block[r]];i--){
if(ts[i]+addx[block[i]]>=w){
cnt++;
}
}
for(register int i=block[l]+1;i<=block[r]-1;i++){
int ll,rr,ans;
ll=bll[i];
rr=blr[i];
ans=bll[i]-1;
while(ll<=rr){
int mid=(ll+rr)>>1;
if(fs[mid]+addx[block[mid]]>=w){
ans=mid;
ll=mid+1;
}
else{
rr=mid-1;
}
}
cnt+=ans-bll[i]+1;
}
return cnt;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(register int i=1;i<=n;i++){
scanf("%lld",&cost[i]);
}
for(register int i=1,opt;i<=m;i++){
scanf("%lld",&opt);
if(opt==1){
int l,r,x;
scanf("%lld%lld%lld",&l,&r,&x);
ad[++cnt1].x=l;
ad[cnt1].time=i;
ad[cnt1].y=x;
ad[++cnt1].x=r+1;
ad[cnt1].time=i;
ad[cnt1].y=-x;
}
else{
int p,y;
scanf("%lld%lld",&p,&y);
fi[++cnt2].x=p;
fi[cnt2].index=cnt2;
fi[cnt2].y=y;
fi[cnt2].time=i;
}
}
std::sort(ad+1,ad+cnt1+1,cmp_add);
std::sort(fi+1,fi+cnt2+1,cmp_find);
size=sqrt(m);
for(register int i=0;i<=m;i++){
block[i]=i/size+1;
}
for(register int i=1;(i-1)*size<=m;i++){
bll[i]=(i-1)*size;
blr[i]=std::min(i*size-1,m);
}
int now=1;
for(register int i=1;i<=cnt2;i++){
while((ad[now].x<fi[i].x||(ad[now].x==fi[i].x&&ad[now].time<fi[i].time))&&now<=cnt1){
change(ad[now].time,m,ad[now].y);
now++;
}
ans[fi[i].index]=query(0,fi[i].time-1,fi[i].y-cost[fi[i].x]);
}
for(register int i=1;i<=cnt2;i++){
printf("%lld\n",ans[i]);
}
return 0;
}