#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, arbi[100000*4], nr, a, b, cod, s;
void update(int node, int st, int dr, int poz, int val)
{
int med;
if (st==dr)
{
arbi[node]+=val;
return;
}
med=(st+dr)/2;
if (poz<=med)
update (node*2, st, med, poz, val);
else
update (node*2+1, med+1, dr, poz, val);
arbi[node]=arbi[node*2]+arbi[node*2+1];
}
int query(int node, int st, int dr, int x, int y)
{
int med=(st+dr)/2, r1=0, r2=0;
if (st>=x && dr<=y)
{
return (arbi[node]);
}
if (med>=x) r1=query (node*2, st, med, x, y);
if (med<y) r2=query (node*2+1, med+1, dr, x, y);
return (r1+r2);
}
int caut(int st, int dr, int S)
{
int mij=(st+dr)/2;
int sum=query(1, 1, n, 1, mij);
if (st==dr)
if (sum==S)
return st;
else
return -1;
if (S>sum)
caut(mij+1, dr, S);
else
if (S<sum)
caut(st, mij, S);
else
return mij;
}
int main()
{
int i, j, a, b;
f>>n>>m;
for (i=1; i<=n; i++)
{
f>>nr;
update(1, 1, n, i, nr);
}
for (i=1; i<=m; i++)
{
f>>cod;
if (cod==0)
{
f>>a>>b;
update(1, 1, n, a, b);
}
if (cod==1)
{
f>>a>>b;
g<<query(1, 1, n, a, b)<<"\n";
}
if (cod==2)
{
f>>s;
g<<caut(1, n, s)<<"\n";
}
}
return 0;
}