Cod sursa(job #721124)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 23 martie 2012 12:17:41
Problema Arbori de intervale Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.82 kb
const val=131072;
//cea mai mica putere a lui 2 mai mare decat (n<=100000)
//aleasa astfel incat arborele de intervale sa fie echilibrat

var v:array[0..2*val] of longint;
    //numarul de frunze este egal cu jumatate din numarul de noduri
    i, j, n, m, max:longint;
    x, y, z, p:longint;
    f, g:text;
    buf1, buf2:array [1.. 1 shl 17] of char;

function maxim (fx, fy:longint):longint; begin if fx>fy then maxim:= fx else maxim:= fy; end;

procedure update (fp, fx:longint);  //pune elementul fx in pozitia fp
  begin
  v[fp]:=fx;
  fp:=fp div 2;
  while fp<>0 do                      //merge pana la radacina (fp=1 -> radacina)
    begin
    v[fp]:=maxim (v[fp*2], v[fp*2+1]); //update nod, maximul dintre fii
    fp:=fp div 2;
    end;
  end;

procedure cauta (s, d, niv:longint);           //s, d capetele intervalului, niv - pozitia in vector
  var mij:longint;
  begin
  mij:=(s+d) div 2;
  if ((x<=s) and (d<=y)) then
    begin
    if v[niv]>max then max :=v[niv];            //conditia de oprire, daca subintervalul pe care suntem
    end                                         //este parte a intervalului cautat
                         else
    begin
    if x<=mij then cauta (s, mij, 2*niv);       //conditia de cautare in subintervalul stanga
    if mij+1<=y then cauta (mij+1, d, 2*niv+1); //conditia de cautare in subintervalul dreapta
    end;
  end;

begin
assign (f, 'arbint.in'); settextbuf (f, buf1); reset (f);
assign (g, 'arbint.out'); settextbuf (g, buf2); rewrite (g);

read (f, n, m);
for i:= 1 to n do
  begin
  read (f, x);
  update (val+i-1, x);
  end;

for i:= 1 to m do
  begin
  read (f, z, x, y);

  if z=1 then update (val+x-1, y);
  if z=0 then
    begin
    max:=0;
    cauta (1, val, 1);
    writeln (g, max);
    end;
  end;

close (f); close (g);
end.