#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[4*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 actualizeaza(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)
actualizeaza(2*nod, st, mijl, a, b);
else
actualizeaza(2*nod+1, mijl+1, dr, a, b);
aib[nod]=aib[2*nod]+aib[2*nod+1];
}
}
inline void verifica(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)
verifica(2*nod, st, mijl, a, b);
if(mijl<b)
verifica(2*nod+1, mijl+1, dr, a, b);
}
}
inline void cautare(int sum)
{
int st=1, dr=n, mijl;
bool gasit=0;
while(st<=dr)
{
mijl=(st+dr)/2;
//out<<st<<' '<<mijl<<' '<<dr<<' ';
suma=0;
verifica(1, 1, n, st, mijl);//out<<suma<<' '<<sum<<'\n';
if(suma>sum)
dr=mijl-1;
else if(suma<=sum)
st=mijl+1;
}
suma=0;
verifica(1, 1, n, st, mijl);
if(suma==sum)
out<<mijl<<'\n';
else out<<mijl-1<<'\n';
}
int main()
{
int i, cod, a, b;
in>>n>>m;
for(i=1; i<=n; ++i)
in>>v[i];
creare(1, 1, n);
suma=0;
verifica(1, 1, n, 1, 4);
while(m--)
{
in>>cod;
if(cod==0)
{
in>>a>>b;
actualizeaza(1, 1, n, a, b);
}
else if(cod==1)
{
in>>a>>b;
if(a!=b)
{
suma=0;
verifica(1, 1, n, a, b);
out<<suma<<'\n';
}
else
out<<v[a]<<'\n';
}
else
{
in>>a;
cautare(a);
}
}
in.close();
out.close();
return 0;
}