Cod sursa(job #1505983)

Utilizator ili226Vlad Ilie ili226 Data 19 octombrie 2015 22:07:40
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.83 kb
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.