Cod sursa(job #1210675)

Utilizator RusuAlexeiRusu Alexei RusuAlexei Data 20 iulie 2014 19:24:23
Problema Arbori de intervale Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.67 kb
program intervale;
  var bufin,bufout:array[1..100000]of byte;
      n,m,i,op,x,y:longint;
      a:array [1..100000] of longint;
      t:array [1..400000] of longint;

function max(u,v:longint):longint;
  begin
    if u>v then max:=u else max:=v;
  end;

function min(u,v:longint):longint;
  begin
    if u<v then min:=u else min:=v;
  end;

procedure build(nod,tl,tr:longint);
  var tm:longint;
  begin
    if tl=tr then t[nod]:=a[tl] else
      begin
        tm:=(tl+tr)shr 1;
        build(nod shl 1,tl,tm);
        build(nod shl 1+1,tm+1,tr);
        t[nod]:=max(t[nod shl 1],t[nod shl 1+1]);
      end;
  end;

function query(nod,tl,tr,l,r:longint):longint;
  var tm:longint;
  begin
    tm:=(tl+tr)shr 1;
    if l>r then query:=0 else
    if (l=tl)and(r=tr) then query:=t[nod] else
      query:=max(query(nod shl 1,tl,tm,l,min(r,tm)),
                 query(nod shl 1+1,tm+1,tr,max(l,tm+1),r));
  end;

procedure update(nod,tl,tr,pos,val:longint);
  var tm:longint;
  begin
    if tl=tr then t[nod]:=val else
      begin
        tm:=(tr+tl) shr 1;
        if pos<=tm then update(nod shl 1,tl,tm,pos,val)
                   else update(nod shl 1+1,tm+1,tr,pos,val);
        t[nod]:=max(t[nod shl 1],t[nod shl 1+1]);
      end;
  end;

begin
  assign(input,'arbint.in');
  reset(input);
  settextbuf(input,bufin);
  assign(output,'arbint.out');
  rewrite(output);
  settextbuf(output,bufout);

  readln(n,m);
  for i :=1 to n do read(a[i]);
  readln;

  build(1,1,n);
  for i:=1 to m do
    begin
      read(op,x,y);
      if op=0 then writeln(query(1,1,n,x,y))
              else update(1,1,n,x,y);
    end;
  close(output);
end.