Cod sursa(job #1231399)

Utilizator Qwerty0606Adrian Tutunaru Qwerty0606 Data 20 septembrie 2014 14:21:11
Problema Arbori de intervale Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.63 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)div 2;
        build(2*nod,tl,tm);
        build(2*nod+1,tm+1,tr);
        t[nod]:=max(t[2*nod],t[2*nod+1]);
      end;
  end;
 
function query(nod,tl,tr,l,r:longint):longint;
  var tm:longint;
  begin
    tm:=(tl+tr)div 2;
    if l>r then query:=0 else
    if (l=tl)and(r=tr) then query:=t[nod] else
      query:=max(query(2*nod,tl,tm,l,min(r,tm)),
                 query(2*nod+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) div 2;
        if pos<=tm then update(2*nod,tl,tm,pos,val)
                   else update(2*nod+1,tm+1,tr,pos,val);
        t[nod]:=max(t[2*nod],t[2*nod+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.