program intervale;
var bufin,bufout:array[1..100000]of byte;
n,m,i,op,x,y:longint;
a:array [1..100000] of longint;
t:array [1..400000] of longint;
function max(u,v:longint):longint;
begin
if u>v then max:=u else max:=v;
end;
function min(u,v:longint):longint;
begin
if u<v then min:=u else min:=v;
end;
procedure build(nod,tl,tr:longint);
var tm:longint;
begin
if tl=tr then t[nod]:=a[tl] else
begin
tm:=(tl+tr)shr 1;
build(nod shl 1,tl,tm);
build(nod shl 1+1,tm+1,tr);
t[nod]:=max(t[nod shl 1],t[nod shl 1+1]);
end;
end;
function query(nod,tl,tr,l,r:longint):longint;
var tm:longint;
begin
tm:=(tl+tr)shr 1;
if l>r then query:=0 else
if (l=tl)and(r=tr) then query:=t[nod] else
query:=max(query(nod shl 1,tl,tm,l,min(r,tm)),
query(nod shl 1+1,tm+1,tr,max(l,tm+1),r));
end;
procedure update(nod,tl,tr,pos,val:longint);
var tm:longint;
begin
if tl=tr then t[nod]:=val else
begin
tm:=(tr+tl) shr 1;
if pos<=tm then update(nod shl 1,tl,tm,pos,val)
else update(nod shl 1+1,tm+1,tr,pos,val);
t[nod]:=max(t[nod shl 1],t[nod shl 1+1]);
end;
end;
begin
assign(input,'arbint.in');
reset(input);
settextbuf(input,bufin);
assign(output,'arbint.out');
rewrite(output);
settextbuf(output,bufout);
readln(n,m);
for i :=1 to n do read(a[i]);
readln;
build(1,1,n);
for i:=1 to m do
begin
read(op,x,y);
if op=0 then writeln(query(1,1,n,x,y))
else update(1,1,n,x,y);
end;
close(output);
end.