#include <stdio.h>
#define mx 100010
long n,m,rez,s,maxnod=0;
long ai[2*mx+4];
void add(long nod, long p, long u, long poz, long x)
{
if (nod>maxnod)
maxnod=nod;
if (p==u && p==poz)
{
ai[nod]+=x;
return;
}
if (p<u)
{
long m=(p+u)/2;
if (poz<=m)
add(nod*2,p,m,poz,x);
if (m<poz)
add(nod*2+1,m+1,u,poz,x);
ai[nod]=ai[2*nod]+ai[2*nod+1];
}
}
void querysint(long nod, long p, long u, long a, long b)
{
if (a<=p && b>=u)
{
rez+=ai[nod];
return;
}
if (p<u)
{
long m=(p+u)/2;
if (a<=m && nod*2<=maxnod)
querysint(nod*2,p,m,a,b);
if (b>m && nod*2+1<=maxnod)
querysint(nod*2+1,m+1,u,a,b);
}
}
void querysm(long nod, long p, long u)
{
if (p==u && s==ai[nod])
{
rez=p;
return;
}
if (ai[nod]<s)
{
s-=ai[nod];
return;
}
if (p<u)
{
long m=(p+u)/2;
if (nod*2<=maxnod)
querysm(2*nod,p,m);
if (rez==0 && nod*2+1<=maxnod)
querysm(2*nod+1,m+1,u);
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%ld %ld",&n,&m);
for (int i=1; i<=n; i++)
{
long x;
scanf("%ld",&x);
add(1,1,n,i,x);
}
for (int i=1; i<=m; i++)
{
long caz,x,y;
scanf("%ld",&caz);
if (caz<2)
scanf("%ld %ld",&x,&y);
else scanf("%ld",&s);
if (caz)
rez=0;
if (caz==2)
{
querysm(1,1,n);
printf("%ld\n",rez);
}
else if (caz==1)
{
querysint(1,1,n,x,y);
printf("%ld\n",rez);
}
else add(1,1,n,x,y);
}
fclose(stdin);
fclose(stdout);
return 0;
}