// Arhiva educationala - Arbori de intervale
var
n, m, i, t, a, b : longint;
v : array[1..500000] of longint;
f, g : text;
function max (a, b : longint) : longint;
begin
if (a > b) then max := a else max := b;
end;
function query (nod, st, dr, a, b : longint) : longint;
var
maxim, mij : longint;
begin
if (a <= st) and (dr <= b) then
begin
query := v[nod]; exit;
end;
mij := (st+dr) div 2; maxim := 0;
if (a <= mij) then
maxim := max (maxim, query (2*nod, st, mij, a, b));
if (mij < b) then
maxim := max (maxim, query (2*nod+1, mij+1, dr, a, b));
query := maxim;
end;
procedure update (nod, st, dr, poz, val : longint);
var
mij : longint;
begin
if (st = poz) and (dr = poz) then
begin v[nod] := val; exit; end;
mij := (st + dr) div 2;
if (poz <= mij) then
update (2*nod, st, mij, poz, val);
if (mij < poz) then
update (2*nod+1, mij+1, dr, poz, val);
v[nod] := max (v[2*nod], v[2*nod+1]);
end;
begin
assign (f, 'arbint.in'); assign (g, 'arbint.out');
reset (f); rewrite (g);
readln (f, n, m);
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
readln (f, t, a, b);
if (t = 1) then
update (1, 1, n, a, b)
else
writeln (g, query (1, 1, n, a, b));
end;
close (f); close (g);
end.