Cod sursa(job #152746)

Utilizator dobreDobre Catalin Andrei dobre Data 9 martie 2008 19:06:53
Problema Arbori de intervale Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.25 kb
program arb_int;
var f,g:text;
    n,m:integer;
    i,z:integer;
    a,b:longint;
    v:array[1..300000]of longint;
function maxim(a,b:longint):longint;
begin
maxim:=(a+b+abs(a-b))div 2;
end;

procedure update(n,st,dr,poz:integer;val:longint);
var mij:integer;
begin
if(st=dr)then v[n]:=val
   else begin
         mij:=(st+dr)div 2;
         if poz<=mij then update(2*n,st,mij,poz,val);
         if poz>mij then update(2*n+1,mij+1,dr,poz,val);
         v[n]:=maxim(v[2*n],v[2*n+1]);
        end;
end;

function query(n,st,dr,a,b:integer):longint;
var ll,rr:longint;
    mij:integer;
begin
if(a<=st)and(dr<=b)then query:=v[n]
else begin
      mij:=(st+dr)div 2;
      ll:=0;rr:=0;
      if a<=mij then ll:=query(2*n,st,mij,a,b);
      if b>mij then rr:=query(2*n+1,mij+1,dr,a,b);
      query:=maxim(ll,rr);
     end;
end;

procedure citire;
var val:longint;
    i:integer;
begin
readln(f,n,m);
for i:=1 to n do begin
     read(f,val);
     update(1,1,n,i,val);
    end;
readln(f);
end;

begin
assign(f,'arbint.in');reset(f);
assign(g,'arbint.out');rewrite(g);
citire;
for i:=1 to m do begin
     readln(f,z,a,b);
     if(z=1)then update(1,1,n,a,b)
        else writeln(g,query(1,1,n,a,b));
    end;
close(f);
close(g);
end.