#include <iostream>
#include <fstream>
#define IN "aib.in"
#define OUT "aib.out"
#define NMAX 100005
using namespace std;
ifstream in(IN);
ofstream out(OUT);
int n, m, v[NMAX], aib[NMAX], suma;
inline void creare(int nod, int st, int dr)
{
if(st==dr)
aib[nod]=v[st];
else{
int mijl=(st+dr)/2;
creare(2*nod, st, mijl);
creare(2*nod+1, mijl+1, dr);
aib[nod]=aib[2*nod]+aib[2*nod+1];
}
}
inline void actualizare(int nod, int st, int dr, int a, int b)
{
if(st==dr)
aib[nod]+=b;
else
{
int mijl=(st+dr)/2;
if(a<=mijl)
actualizare(2*nod, st, mijl, a, b);
else
actualizare(2*nod+1, mijl+1, dr, a, b);
aib[nod]=aib[2*nod]+aib[2*nod+1];
}
}
inline void calcsuma(int nod, int st, int dr, int a, int b)
{
if(a<=st && b>=dr)
suma+=aib[nod];
else
{
int mijl=(st+dr)/2;
if(a<=mijl)
calcsuma(2*nod, st, mijl, a, b);
if(b>mijl)
calcsuma(2*nod+1, mijl+1, dr, a, b);
}
}
inline int cauta(int sum)
{
int st=1, dr=n, mijl;
while(st<=dr)
{
mijl=(st+dr)/2;
suma=0;
calcsuma(1, 1, n, 1, mijl);
//out<<st<<' '<<mijl<<' '<<dr<<'\n';
//out<<suma<<' '<<sum<<'\n';
if(suma==sum)
return mijl;
if(suma>sum)
dr=mijl-1;
else
st=mijl+1;
}
return -1;
}
int main()
{
int i, cod, a, b;
in>>n>>m;
for(i=1; i<=n; ++i)
in>>v[i];
creare(1, 1, n);
while(m--)
{
in>>cod;
if(cod==0)
{
in>>a>>b;
actualizare(1, 1, n, a, b);
}
else if(cod==1)
{
suma=0;
in>>a>>b;
calcsuma(1, 1, n, a, b);
out<<suma<<'\n';
}
else
{
in>>a;
out<<cauta(a)<<'\n';
}
}
in.close();
out.close();
return 0;
}