#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;using float64=double;using float80=long double;
constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){if(x<y)x=y;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){if(x>y)x=y;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=1e5+10,B=317,NB=B+10;int __test_num=1,__task_id,__tst;using namespace std;void __init();
int n,q,op[N],ans[N];int64 A[N];vector<pair<int,int64>> upd[N],qry[N];
int btot,blng[N],L[NB],R[NB];int64 arr[N],sorted[N],add[NB];
void build(){
L[0]=1-B;btot=(q-1)/B+1;forUp(bid,1,btot){
L[bid]=L[bid-1]+B,R[bid]=min(R[bid-1]+B,q);
forUp(pos,L[bid],R[bid])blng[pos]=bid;
}
}
void rebuild(int bid){
forUp(pos,L[bid],R[bid])sorted[pos]=arr[pos];
sort(sorted+L[bid],sorted+R[bid]+1);
}
void update(int pos,int64 x){
int bid=blng[pos];
forUp(k,pos,R[bid])arr[k]+=x;rebuild(bid);
forUp(k,bid+1,btot)add[k]+=x;
}
int query(int pos,int64 x){
int ans=0>=x;
if(pos==0)return ans;
int bid=blng[pos];
forUp(k,L[bid],pos)if(arr[k]+add[bid]>=x)++ans;
forUP(k,1,bid){
int p=lower_bound(sorted+L[k],sorted+R[k]+1,x-add[k])-sorted;
ans+=R[k]-p+1;
}
return ans;
}
bool __med;void __solve(int __test_id){
cin>>n>>q;
forUp(i,1,n)cin>>A[i];
forUp(i,1,q){
cin>>op[i];
if(op[i]==1){
int l,r;int64 x;cin>>l>>r>>x;
upd[l].pushb({i,x});
upd[r+1].pushb({i,-x});
}
if(op[i]==2){
int pos;int64 x;cin>>pos>>x;
qry[pos].pushb({i,x-A[pos]});
}
}
build();
forUp(i,1,n){
for(auto [pos,val]:upd[i])update(pos,val);
for(auto [qid,val]:qry[i])ans[qid]=query(qid-1,val);
}
forUp(i,1,q)if(op[i]==2)cout<<ans[i]<<'\n';
}
signed main(){
__init();
forUp(i,1,__test_num)__solve(i);
cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
return 0;
}
void __init(){
__tst=clock();
#ifndef use_file
//#define use_file
#endif
#ifdef use_file
const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
#endif
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//scanf("%d",&__test_num);
//cin>>__test_num;
}