Pagini recente » Cod sursa (job #1001358) | Cod sursa (job #2336274) | Cod sursa (job #436499) | Cod sursa (job #2299557) | Cod sursa (job #844647)
Cod sursa(job #844647)
program arbori_de_intervale;
type arbore=^nod;
nod=record
st,dr,max:longint;
left,right:arbore;
end;
var f1,f2:text;
n,m,i,b,c:longint;
a:array [1..100000] of longint;
t:arbore;
op:byte;
bufin,bufout:array [1..100000] of byte;
function arb(x,y:longint):arbore;
var r:arbore;
begin
if x=y then begin
new(r);
r^.st:=x;
r^.dr:=y;
r^.max:=a[x];
r^.left:=nil;
r^.right:=nil;
arb:=r;
end
else begin
new(r);
r^.st:=x;
r^.dr:=y;
r^.left:=arb(x,(x+y)div 2);
r^.right:=arb((x+y)div 2+1,y);
if r^.left^.max>r^.right^.max then r^.max:=r^.left^.max
else r^.max:=r^.right^.max;
arb:=r;
end;
end;
function maxim(r:arbore):longint;
var x,y:longint;
begin
if (b<=r^.st) and (c>=r^.dr) then maxim:=r^.max
else if c<=(r^.st+r^.dr) div 2 then maxim:=maxim(r^.left)
else if b>(r^.st+r^.dr) div 2 then maxim:=maxim(r^.right)
else begin x:=maxim(r^.left); y:=maxim(r^.right);
if x>y then maxim:=x else maxim:=y;
end;
end;
procedure submit(r:arbore);
begin
if r^.st=r^.dr then r^.max:=c else
begin
if b<=(r^.st+r^.dr) div 2 then submit(r^.left)
else submit(r^.right);
if r^.left^.max>r^.right^.max then r^.max:=r^.left^.max
else r^.max:=r^.right^.max;
end;
end;
begin
assign(f1,'arbint.in');
reset(f1);
assign(f2,'arbint.out');
rewrite(f2);
settextbuf(f1,bufin);
settextbuf(f2,bufout);
readln(f1,n,m);
for i:=1 to n do read(f1,a[i]); readln(f1);
t:=arb(1,n);
for i:=1 to m do
begin
readln(f1,op,b,c);
if op=0 then writeln(f2,maxim(t))
else submit(t);
end;
close(f1);
close(f2);
end.