#include<fstream>
#include<algorithm>
#define _NM 100010
#define _TM 262144
using namespace std;
int nA, vA[_NM];
int i_tree[_TM];
int create_tree(int iNod, int le, int ri)
{
if (le==ri) return i_tree[iNod]=vA[le];
return i_tree[iNod]=
create_tree(2*iNod,le,(le+ri)/2)+create_tree(2*iNod+1,(le+ri)/2+1,ri);
}
int update_tree(int iNod, int le, int ri, int poz)
{
if (le==ri) return i_tree[iNod]=vA[le];
if (le>poz||ri<poz) return i_tree[iNod];
return i_tree[iNod]=update_tree(2*iNod,le,(le+ri)/2,poz)+update_tree(2*iNod+1,(le+ri)/2+1,ri,poz);
}
int sumq_tree(int iNod, int le, int ri, int i, int j)
{
if (le>j||ri<i) return 0;
if (le>=i&&ri<=j) return i_tree[iNod];
return sumq_tree(2*iNod,le,(le+ri)/2,i,j)+sumq_tree(2*iNod+1,(le+ri)/2+1,ri,i,j);
}
int kq_tree(int iNod, int le, int ri, int sum)
{
if (sum==i_tree[iNod]) return ri;
if (le==ri||sum<0||sum>i_tree[iNod]) return -1;
return max(kq_tree(iNod*2,le,(le+ri)/2,sum),kq_tree(2*iNod+1,(le+ri)/2+1,ri,sum-i_tree[2*iNod]));
}
int main()
{
ifstream fin("aib.in");
ofstream fout("aib.out");
int nOp; fin>>nA>>nOp;
for (int i=1;i<=nA;i++)
fin>>vA[i];
create_tree(1,1,nA);
for (int i=1;i<=nOp;i++)
{
int op; fin>>op;
switch(op)
{
case 0:
int poz,val;
fin>>poz>>val; vA[poz]+=val;
update_tree(1,1,nA,poz);
break;
case 1:
int a,b;
fin>>a>>b;
fout<<sumq_tree(1,1,nA,a,b)<<'\n';
break;
case 2:
int sum; fin>>sum;
fout<<kq_tree(1,1,nA,sum)<<'\n';
}
}
return 0;
}