Cod sursa(job #429725)

Utilizator lakat_tLakatos Tamas lakat_t Data 30 martie 2010 13:36:31
Problema Arbori de intervale Scor 50
Compilator fpc Status done
Runda Arhiva educationala Marime 1.28 kb
program intervallumfa;
var
 v:array[1..100000]of longint;
 w:array[1..300000] of longint;
 f,g:text;
 i,n,a,b,m,t,max:longint;

procedure betesz(cs,bal,jobb,i,ertek:longint);
var
 kozep:longint;
begin
 if bal=jobb
  then w[cs]:=ertek
  else begin
   kozep:=(bal+jobb) div 2;
   if i<=kozep then betesz(cs*2,bal,kozep,i,ertek)
               else betesz(cs*2+1,kozep+1,jobb,i,ertek);
   if w[cs*2]>w[cs*2+1] then w[cs]:=w[cs*2]
                        else w[cs]:=w[cs*2+1];
  end;
end;

function leker(cs,bal,jobb,a,b:longint):longint;
var
 kozep,m1,m2:longint;
begin
 if (a<=bal) and (jobb<=b)
  then leker:=w[cs]
  else begin
   kozep:=(bal+jobb) div 2;
   m1:=0;
   m2:=0;
   if a<=kozep then m1:=leker(cs*2,bal,kozep,a,b);
   if b>=kozep+1 then m2:=leker(cs*2+1,kozep+1,jobb,a,b);
   if m1>m2 then leker:=m1
            else leker:=m2;
  end;
end;

begin
 assign(f,'arbint.in');
 reset(f);
 assign(g, 'arbint.out');
 rewrite(g);
 readln(f, n,m);
 for i:=1 to n do
  begin
   read(f, v[i]);
   betesz(1,1,n,i,v[i]);
  end;
 for i:=1 to m do
  begin
   readln(f, t,a,b);
   if t=0 then begin
                max:=leker(1,1,n,a,b);
                writeln(g, max);
               end;
   if t=1 then betesz(1,1,n,a,b);
  end;
 close(f);
 close(g);
end.