// Arhiva educationala - Arbori de intervale
var
n, m, i2, i, t, a, b : longint;
v : array[1..400100] of longint;
//s : array[1..1000000] of char;
f, g : text;
function query (nod, st, dr, a, b : longint) : int64;
var
mij, t : longint;
m1, m2 : longint;
begin
if (a <= st) and (dr <= b) then
begin
query := v[nod]; exit
end;
mij := (st+dr) shr 1; m1 := 0; m2 := 0;
t := nod shl 1;
if (a <= mij) then
m1 := query (t, st, mij, a, b);
if (mij < b) then
m2 := query (t + 1, mij+1, dr, a, b);
query := m1 + m2;
end;
function query2 (nod, st, dr, a : longint) : longint;
var
mij, t : longint;
begin
if (a = v[nod]) and (st=dr) then
begin
query2 := st; exit;
end;
mij := (st+dr) shr 1;
t := nod shl 1;
if (v[t] >= a) then
query2 := query2 (t, st, mij, a)
else //if (v[t] < a) then
query2 := query2 (t + 1, mij+1, dr, a - v[t]);
end;
procedure update (nod, st, dr, poz, val : longint);
var
mij, t: longint;
begin
if (st = poz) and (dr = poz) then
begin v[nod] := v[nod] + val; exit; end;
mij := (st + dr) shr 1;
t := nod shl 1;
if (poz <= mij) then
update (t, st, mij, poz, val)
else
update (t + 1, mij+1, dr, poz, val);
v[nod] := v[t] + v[t+1];
end;
begin
assign (f, 'aib.in'); assign (g, 'aib.out');
reset (f); rewrite (g);
readln (f, n, m);
{read (f, s);
i:=1; i2 := 0;
while (s[i] <> #0) do
begin
a := 0; inc(i2);
while (s[i] <> #0) and (s[i]<>#32) do
begin
a := a*10+ord(s[i])-48;
inc(i);
end;
update (1, 1, n, i2, a);
inc(i);
end;}
for i := 1 to n do
begin read (f, a); update(1, 1, n, i, a); end;
readln (f);
for i := 1 to m do
begin
read (f, t);
if (t = 0) then
begin
readln (f, a, b);
update (1, 1, n, a, b)
end
else
if (t = 1) then
begin
readln (f, a, b);
writeln (g, query (1, 1, n, a, b))
end
else
begin
readln (f, a);
writeln (g, query2 (1, 1, n, a));
end;
end;
close (f); close (g);
end.