program arbint;
{const Nmax=100100;}
var
{v:array[0..Nmax]of longint;}
stdin,stdout:text;
a,b,x,i,n,m:longint;
start, finish, val, pos, maxim:longint;
arb:array[0..400100]of longint;
procedure querry(nod,left,right:longint);
var mid:longint;
begin
if (start<=left) and (right<=finish)then
begin
if ( maxim < arb[nod] )then
maxim := arb[nod];
end
else
begin
mid:=(left+right)div 2;
if (start<=mid)then
querry(2*nod,left,mid);
if (mid<finish)then
querry(2*nod+1,mid+1,right);
end;
end;
{
function max(a,b:integer):integer;
begin
if (a>b)then
maxim:=a;
if (a<=b)then
maxim:=b;
end;
}
procedure update(nod,left,right:longint);
var mid,max:longint;
begin
mid:=(left+right)div 2;
if (left=right)then
begin
arb[nod]:=val;
end
else
begin
if (pos<=mid)then
update(2*nod,left,mid)
else
begin
update(2*nod+1,mid+1,right);
end;
max:=arb[2*nod];
if (arb[2*nod+1]>max)then
max:=arb[2*nod+1];
arb[nod]:=max;
//arb[nod] := max( arb[2*nod], arb[2*nod+1] );
end;
end;
(*
procedure make;
var i:longint;
begin
for i:=1 to n do
begin
pos:=i;
val:=v[i];
update(1,1,n);
end;
end; *)
begin
start:=0;finish:=0;pos:=0;val:=0;maxim:=0;
for i:=1 to 400000 do arb[i]:=0;
assign(stdin,'arbint.in');reset(stdin);
assign(stdout,'arbint.out');rewrite(stdout);
read(stdin,n,m);
for i:=1 to n do
begin
read(stdin,x);
pos:=i;
val:=x;
update(1,1,n);
end;
for i:=1 to m do
begin
read(stdin,x,a,b);
if (x=0)then
begin
maxim:=-1;
start:=a;
finish:=b;
querry(1,1,n);
writeln(stdout,maxim);
end
else if (x=1)then
begin
pos:=a;
val:=b;
update(1,1,n);
end;
end;
close(stdin);
close(stdout);
end.