Cod sursa(job #587344)

Utilizator gicu_01porcescu gicu gicu_01 Data 4 mai 2011 18:17:51
Problema Range minimum query Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.12 kb
var a:array[0..20,1..100000]of longint;
    buf:array[1..1000000]of longint;
    c:array[0..1000000]of longint;
    b:array[0..20]of longint;
    n,m:longint;

procedure putere;
var i:integer;
begin
 b[0]:=1;
 for i:=1 to 17 do
  b[i]:=b[i-1]*2;
end;

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

procedure mat;
var i,j:longint;
begin
 for i:=1 to 17 do
  begin
   for j:=1 to n do a[i,j]:=min(a[i-1,j],a[i-1,min(b[i-1]+j,n)]);
  end;
end;

function cal(x,y:longint):longint;
var k,i,p,m:longint;
begin
 if x=y then cal:=a[0,x] else
  begin
   k:=y-x+1;
   for i:=17 downto 0 do
    if k div b[i]=1 then
     begin
      cal:=min(a[i-1,x],a[i-1,y-b[i]+1]);
     end;
  end;
end;

procedure body;
var i,x,y,p,l:longint;f,g:text;
begin
 assign(f,'rmq.in');
 reset(f);
 settextbuf(f,buf);
 assign(g,'rmq.out');
 rewrite(g);
 settextbuf(g,buf);
 readln(f,n,m);
 l:=0;
 for i:=1 to n do readln(f,a[0,i]);
 mat;
 for i:=1 to m do
  begin
   readln(f,x,y);
   writeln(g,cal(x,y));
  end;
 close(g);
 close(f);
end;



begin
 putere;
 body;
end.