#include<bits/stdc++.h>
#define int long long
#define file(name) freopen(name".in","r",stdin);
using namespace std;
int n;
const int maxn=200006;
struct Segment{
long long a[maxn],w[4*maxn],lzy[4*maxn];
void pushup(int u)
{
w[u]=w[u*2]+w[u*2+1];
lzy[u]=-1;
}
void build(int u=1,int l=1,int r=n)
{
if(l==r)
{
w[u]=a[l];
return;
}
int m=(l+r)/2;
build(u*2,l,m),build(u*2+1,m+1,r);
pushup(u);
}
bool InRange(int L,int R,int l,int r)
{
return (l<=L)&&(R<=r);
}
bool OutofRange(int L,int R,int l,int r)
{
return (L>r)||(R<l);
}
void maketag(int u,int len,long long x)
{
lzy[u]=x;
w[u]=len*x;
}
void pushdown(int u,int l,int r)
{
int m=(l+r)/2;
if(lzy[u]!=-1)
{
maketag(u*2,m-l+1,lzy[u]);
maketag(u*2+1,r-m,lzy[u]);
}
lzy[u]=-1;
}
int query(int l,int r,int u=1,int L=1,int R=n)
{
if(InRange(L,R,l,r)) return w[u];
else if(!OutofRange(L,R,l,r))
{
int m=(L+R)/2;
pushdown(u,L,R);
return query(l,r,u*2,L,m)+query(l,r,u*2+1,m+1,R);
}
else return 0;
}
void update(int l,int r,long long x,int u=1,int L=1,int R=n)
{
if(InRange(L,R,l,r)) maketag(u,R-L+1,x);
else if(!OutofRange(L,R,l,r))
{
int m=(L+R)/2;
pushdown(u,L,R);
update(l,r,x,u*2,L,m);
update(l,r,x,u*2+1,m+1,R);
pushup(u);
}
}
}a;
struct Pair{
int first,second;
};
int find1(int L,int R,int y)
{
int l=L,r=R;
while(l<r)
{
int mid=(l+r-1)/2;
if(a.query(mid,mid)>y) l=mid+1;
else r=mid;
}
return l;
}
int find2(int L,int y)
{
int l=L-1,r=n;
while(l<r)
{
int mid=(l+r+1)/2;
if(a.query(L,mid)>y) r=mid-1;
else l=mid;
}
return l;
}
int query(int l,int y)
{
int ln=a.query(l,n);
if(ln<=y) return n-l+1;
if(l==n) return 0;
int L=find2(l,y);
y-=a.query(l,L);
int ans=query(find1(L+1,n,y),y);
return ans+(L-l+1);
}
signed main()
{
int m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a.a[i];
a.build();
while(m--)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
{
int w=find1(1,x,y);
a.update(w,x,y);
}
else
{
cout<<query(x,y)<<endl;
}
}
return 0;
}