Cod sursa(job #844523)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 29 decembrie 2012 14:15:28
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 2.19 kb
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;

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);
  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.