Cod sursa(job #152772)

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

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

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

procedure citire;
var val:longint;
    i:longint;
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.