program maxq;
var f,g:text;
maxarb:array[1..400000] of longint;
n,m,i,j,pos,val:longint;
nr,start,finish:longint;
maxim,x,a,b:longint;
bufin,bufout:array[1..65000] of byte;
function max (a,b:longint):longint;
begin
if a>b then max:=a
else max:=b;
end;
procedure update (nod,st,dr:longint);
var jum:longint;
begin
if st=dr then
begin
maxarb[nod]:=val;
end
else
begin
jum:=(st+dr) div 2;
if pos<=jum then update (2*nod, st,jum)
else update (2*nod+1,jum+1,dr);
maxarb[nod]:=max (maxarb[2*nod],maxarb[2*nod+1]);
end;
end;
procedure query (nod, st,dr:longint);
var jum:longint;
begin
if (start<=st) and (dr<=finish) then
begin
if maxim<maxarb[nod] then maxim:=maxarb[nod];
end
else
begin
jum:=(st+dr) div 2;
if start<=jum then query(2*nod,st,jum);
if jum<finish then query(2*nod+1,jum+1,dr);
end;
end;
begin
assign (f,'arbint.in'); reset (f);
assign (g,'arbint.out'); rewrite(G);
settextbuf (f,bufin);
settextbuf (g,bufout);
readln (f,n,m);
for i:=1 to n do
begin
read (f,nr);
pos:=i; val:=nr;
update (1,1,n);
end;
readln (f);
for i:=1 to m do
begin
read (f,x,a,b);
if x=0 then
begin
maxim:=-1;
start:=a; finish:=b;
query(1,1,n);
writeln (g,maxim);
end
else
begin
pos:=a; val:=b;
update(1,1,n);
end;
end;
close (f); close (g);
end.