type nd=^nod;
nod=record
val:longint;
st,dr:nd
end;
var cap:nd;
tip,max,x,y,m,n,i:longint;
f,fo:text;
function querry(p:nd;st,dr,x,y:longint):longint;
var a,b,mij,m:longint;
begin
if (st>=x)and(dr<=y)then
querry:=p^.val
else
if ((st<=x)and(dr>=y))or
((st<=x)and(dr>=x))or
((st<=y)and(dr>=y))then
begin
mij:=st+(dr-st)div 2;
a:=-1;b:=-1;
a:=querry(p^.st,st,mij,x,y);
b:=querry(p^.dr,mij+1,dr,x,y);
m:=a;
if b>a then m:=b;
querry:=m;
end
else querry:=-1;
end;
function update(var p:nd;st,dr,poz,pun:longint):longint;
var mij,a,b,m:longint;
begin
if (st=dr)and(st=poz)
then
begin
p^.val:=pun;
update:=pun
end
else
begin
mij:=st+(dr-st)div 2;a:=-1;b:=-1;
if (st<=poz)and(mij>=poz)then
begin a:=update(p^.st,st,mij,poz,pun);
b:=p^.dr^.val
end;
if (mij+1<=poz)and(dr>=poz)then
begin a:=p^.st^.val;
b:=update(p^.dr,mij+1,dr,poz,pun)
end;
m:=a;
if b>a then m:=b;
p^.val:=m;
update:=m
end;
end;
procedure init(x,y:longint;var arb:nd);
var p:nd;
mij:longint;
begin
if x=y then
begin
new(p);
p^.val:=0;
p^.st:=nil;
p^.dr:=nil;
arb:=p;
end
else
begin
mij:=x+(y-x)div 2;
new(p);
p^.val:=0;
init(x,mij,p^.st);
init(mij+1,y,p^.dr);
arb:=p;
end;
end;
begin
assign(f,'arbint.in');
assign(fo,'arbint.out');
reset(f);
readln(f,n,m);
init(1,n,cap);
for i:=1 to n do
begin
read(f,x);
update(cap,1,n,i,x)
end;
readln(f);rewrite(fo);
for i:=1 to m do
begin
readln(f,tip,x,y);
if tip=0 then
begin
max:=querry(cap,1,n,x,y);
writeln(fo,max)
end
else
begin
update(cap,1,n,x,y);
end
end;
close(fo);
close(f);
end.