Cod sursa(job #676156)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 8 februarie 2012 19:25:13
Problema Arbori de intervale Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.47 kb
var v:array[1..263000] of longint;
    i, m, n, x, y, max, c:longint;
    buf1, buf2:array[1..200000] of char;
    f, g:text;

function maxim (a, b:longint):longint;
  begin if a> b then maxim:=a else maxim := b; end;

procedure repl(k, st, dr:longint);
var mij:longint;
  begin
  if st = dr then v[k]:=y
             else
    begin
    mij:=(st+dr) div 2;
    if x<=mij then repl (k*2, st, mij)
              else repl (k*2+1, mij+1, dr);
    v[k]:=maxim(v[k*2], v[k*2+1]);
    end;
  end;

procedure init(k, st, dr:longint);
var mij:longint;
  begin
  if st = dr then read (f, v[k])
             else
    begin
    mij := (st+dr) div 2;
    init(k*2, st, mij);
    init(k*2+1, mij+1, dr);
    v[k]:=maxim(v[k*2], v[k*2+1]);
    end;
  end;

procedure find (k, st, dr:longint);
var mij:longint;
  begin
  if (st>=x) and (dr<=y) then
    begin
    if v[k]>max then max := v[k];
    end
                     else
    begin
    mij:= (st+dr) div 2;
    if mij >=x then find (k*2, st, mij);
    if mij <y then find (k*2+1, mij+1, dr);
    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);
init (1, 1, n);

for i := 1 to m do
  begin
  read (f, c, x, y);
  case c of
    0:begin
      max:=0;
      find(1, 1, n);
      writeln (g, max);
      end;
    1:begin
      repl(1, 1, n);
      end;
    end;
  end;

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