Cod sursa(job #917662)

Utilizator andrei_toaderToader Andrei Sorin andrei_toader Data 18 martie 2013 11:16:46
Problema Arbori de intervale Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.38 kb
program maxq;
var f,g:text;
    maxarb:array[1..400000] of longint;
    n,m,i,j,pos,val:longint;
    nr,start,finish:longint;
    maxim,x,a,b:longint;
    bufin,bufout:array[1..65000] of byte;

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

procedure update (nod,st,dr:longint);
var jum:longint;
begin
 if st=dr then
 begin
  maxarb[nod]:=val;
 end
 else
 begin
  jum:=(st+dr) div 2;
  if pos<=jum then update (2*nod, st,jum)
  else update (2*nod+1,jum+1,dr);
  maxarb[nod]:=max (maxarb[2*nod],maxarb[2*nod+1]);
 end;
end;

procedure query (nod, st,dr:longint);
var jum:longint;
begin
 if (start<=st) and (dr<=finish) then
 begin
  if maxim<maxarb[nod] then maxim:=maxarb[nod];
 end
 else
 begin
  jum:=(st+dr) div 2;
  if start<=jum then query(2*nod,st,jum);
  if jum<finish then query(2*nod+1,jum+1,dr);
 end;
end;

begin
 assign (f,'arbint.in'); reset (f);
 assign (g,'arbint.out'); rewrite(G);
 settextbuf (f,bufin);
 settextbuf (g,bufout);
 readln (f,n,m);
 for i:=1 to n do
 begin
  read (f,nr);
  pos:=i; val:=nr;
  update (1,1,n);
 end;
 readln (f);
 for i:=1 to m do
 begin
  read (f,x,a,b);
  if x=0 then
  begin
   maxim:=-1;
   start:=a; finish:=b;
   query(1,1,n);
   writeln (g,maxim);
  end
  else
  begin
     pos:=a; val:=b;
     update(1,1,n);
  end;
 end;
 close (f); close (g);
end.