#include <iostream>
#include <fstream>
#include <stdio.h>
#define MAXN 100000
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M;
int Tree[MAXN+10];
int *Vector;
int CreateTree(int k,int left,int right)
{
if(left==right)
{
Tree[k]=Vector[left];
return Tree[k];
}
int m=(left+right)/2;
int nr1,nr2;
nr1=CreateTree(2*k,left,m);
nr2=CreateTree(2*k+1,m+1,right);
Tree[k]=nr1+nr2;
return Tree[k];
}
void Update(int k,int left,int right,int a,int b)
{
if(left==right)
{
Tree[k]+=b;
return;
}
int m=(left+right)/2;
if(a<=m)
Update(2*k,left,m,a,b);
else
Update(2*k+1,m+1,right,a,b);
Tree[k]+=b;
}
void Read()
{
fin>>N>>M;
int i,x;
// Tree=new int [4*N];
for(i=1;i<=N;i++)
{
fin>>x;
Update(1,1,N,i,x);
}
// CreateTree(1,1,N);
// delete Vector;
}
int Query1(int k,int left,int right,int a,int b)
{
if(a<=left&&right<=b)
{
return Tree[k];
}
int m=(left+right)/2;
int nr1=0,nr2=0;
if(a<=m)
nr1=Query1(2*k,left,m,a,b);
if(b>m)
nr2=Query1(2*k+1,m+1,right,a,b);
return nr1+nr2;
}
int Query2(int k,int left,int right,int a,int &s)
{
if(s+Tree[k]<=a)
{
s+=Tree[k];
return right;
}
if(left==right)
{
s+=Tree[k];
return -1;
}
int m=(left+right)/2;
int nr=-1;
nr=Query2(2*k,left,m,a,s);
if(s==a)
return nr;
// printf("%d %d %d\n",k,s,a);
if(s<a)
return Query2(2*k+1,m+1,right,a,s);
return -1;
}
void write()
{
int i;
for(i=1;i<=15;i++)
printf("%d %d\n",i,Tree[i]);
}
int main()
{
Read();
int i,sw,a,b;
for(i=1;i<=M;i++)
{
fin>>sw;
if(sw==0)
{
fin>>a>>b;
Update(1,1,N,a,b);
}
else if(sw==1)
{
fin>>a>>b;
fout<<Query1(1,1,N,a,b)<<'\n';
}
else{
fin>>a;
b=0;
fout<<Query2(1,1,N,a,b)<<'\n';
}
}
fin.close();
fout.close();
return 0;
}