Cod sursa(job #408493)

Utilizator hungntnktpHungntnktp hungntnktp Data 3 martie 2010 04:52:46
Problema Range minimum query Scor 40
Compilator fpc Status done
Runda Arhiva educationala Marime 1.3 kb
{DINH QUANG DAT TIN 07-10}
{RMQ}
{$inline on}
{$mode objfpc}
CONST
 TFI='rmq.in';
 TFO='rmq.out';
 MAX=100001;
TYPE
 arr1int=array[0..MAX] of longint;
VAR
 fi,fo:text;
 n,q:longint;
 f:array[0..MAX,0..17] of longint;
 a:arr1int;

PROCEDURE       input;inline;
var
 i:longint;
begin
 read(fi,n,q);
 for i:= 1 to n do read(fi,a[i]);
end;

FUNCTION        smin(x,y:longint):longint;
begin
 if x>y then exit(y);
 exit(x);
end;

PROCEDURE       init;inline;
var
 i,j,l,k:longint;
begin
 for i:= 1 to n do f[i][0]:=a[i];
 k:=trunc(ln(n)/ln(2))+1;
 for j:= 1 to k do
  begin
   l:=1 shl j;
   for i:= 1 to n do
    if i+l-1<=n then
     begin
      if f[i][j-1]>f[i+1 shl (j-1)][j-1] then f[i][j]:=f[i+1 shl (j-1)][j-1]
       else f[i][j]:=f[i][j-1];
     end
      else break;
  end;
end;

FUNCTION        find(u,v:longint):longint;inline;
var
 l:longint;
begin
 l:=trunc(ln(v-u+1)/ln(2));
 if f[u][l]>f[v-1 shl l +1][l] then find:=f[v-1 shl l+1][l]
  else find:=f[u][l];
end;

PROCEDURE       process;inline;
var
 res,x,y,i:longint;
begin
 for i:= 1 to q do
  begin
   read(fi,x,y);
   res:=find(x,y);
   writeln(fo,res);
  end;
end;

BEGIN
 assign(fi,tfi);reset(fi);
 assign(fo,tfo);rewrite(fo);
  input;
  init;
  process;
 close(fo);
 close(fi);
END.