#include <cstdio>
using namespace std;
constexpr int NMAX = 1e5 + 5;
int arb[4*NMAX];
int N;
void update (int nod, int a, int b, int poz, int val)
{
if (a == b)
{
arb[nod] += 1LL*val;
return;
}
int mij = (a + b) / 2;
if (poz <= mij)
update(2*nod, a, mij, poz, val);
else
update(2*nod+1, mij+1, b, poz, val);
arb[nod] = arb[2*nod] + arb[2*nod+1];
}
int query (int nod, int a, int b, int qa, int qb)
{
if (qa <= a && b <= qb)
return arb[nod];
int mij = (a + b) / 2;
int ans_1 = 0, ans_2 = 0;
if (qa <= mij)
ans_1 = query(2*nod, a, mij, qa, qb);
if (mij < qb)
ans_2 = query(2*nod+1, mij+1, b, qa, qb);
return ans_1 + ans_2;
}
void Tip_0 ()
{
int x, y;
scanf("%d%d", &x, &y);
update(1, 1, N, x, y);
}
void Tip_1 ()
{
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", query(1, 1, N, x, y));
}
void Tip_2 ()
{
int a;
scanf("%d", &a);
int st = 1, dr = N;
int sol = 0, val = 0;
while(st <= dr)
{
int m = (st + dr) / 2;
int now = query(1, 1, N, 1, m);
if(now >= a)
sol = m, val = now, dr = m - 1;
else
st = m + 1;
}
if(val != a)
sol = -1;
printf("%d\n", sol);
}
void Read_and_Solve ()
{
int T;
scanf("%d%d", &N, &T);
for (int i = 1; i <= N; ++i)
{
int x;
scanf("%d", &x);
update(1, 1, N, i, x);
}
for (; T; --T)
{
int x;
scanf("%d", &x);
if (x == 0)
Tip_0();
if (x == 1)
Tip_1();
if (x == 2)
Tip_2();
}
}
int main ()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
Read_and_Solve();
return 0;
}