Cod sursa(job #621098)

Utilizator MihaiBunBunget Mihai MihaiBun Data 16 octombrie 2011 18:15:21
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.57 kb
program kk;
var f,g:text;
    max:array[1..1000000] of longint;
    n,m,i,a,b,sol,op :longint;

function maxim(s,t:longint):longint;
begin
  if s<t then maxim:=t
         else maxim:=s;
end;

procedure facarbore(p,u,nod:longint);
var mij:longint;
begin
  if p=u then read(f,max[nod])

         else begin
                 mij:=(u+p) div 2;
                 facarbore(p,mij,nod*2);
                 facarbore(mij+1,u,nod*2+1);
                 max[nod]:=maxim(max[nod*2],max[nod*2+1]);
              end;
end;

procedure aflamax(p,u,nod:longint);
var mij:longint;
begin
  if (a<=p)and(b>=u)then begin
                          if sol<max[nod] then sol:=max[nod];
                          exit();
                         end;
  mij:=(p+u)div 2;
  if a<=mij then aflamax(p,mij,nod*2);
  if b>=mij+1 then aflamax(mij+1,u,nod*2+1);
end;

procedure update(p,u,nod:longint);
var mij:longint;
begin
   if p=u then max[nod]:=b
          else begin
                 mij:=(p+u)div 2;
                 if a<=mij then update(p,mij,nod*2)
                           else update(mij+1,u,nod*2+1);
                 max[nod]:=maxim(max[nod*2],max[nod*2+1]);
          end;
end;

begin
  assign(f,'arbint.in');
  assign(g,'arbint.out');
  rewrite(g);
  reset(f);
  readln(f,n,m);
  facarbore(1,n,1);
  for i:=1 to m do
  begin
    readln(f,op,a,b);
    if op=0 then begin
                   sol:=0;
                   aflamax(1,n,1);
                   writeln(g,sol);
                 end
            else update(1,n,1);
  end;
close(f);
close(g);
end.