#include <fstream>
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
constexpr int NMAX = 1e5 + 5;
int arb[2*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;
f >> x >> y;
update(1, 1, N, x, y);
}
void Tip_1 ()
{
int x, y;
f >> x >> y;
g << query(1, 1, N, x, y) << '\n';
}
void Tip_2 ()
{
int a;
f >> a;
int st = 1, dr = N;
int sol = 0;
while (st <= dr)
{
int mij = (st + dr) / 2;
int sum = query(1, 1, N, 1, mij);
if (sum < a) st = mij + 1;
else if (sum > a) dr = mij - 1;
else
{
sol = mij;
dr = mij - 1;
}
}
g << sol << '\n';
}
void Read_and_Solve ()
{
int T;
f >> N >> T;
for (int i = 1; i <= N; ++i)
{
int x;
f >> x;
update(1, 1, N, i, x);
}
for (; T; --T)
{
int x;
f >> x;
if (x == 0) Tip_0();
if (x == 1) Tip_1();
if (x == 2) Tip_2();
}
}
int main ()
{
Read_and_Solve();
return 0;
}