Cod sursa(job #587319)

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

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

function putere2:longint;
var i:longint;
begin
 for i:=17 downto 0 do
  if b[i]<n then break;
 putere2:=i+1;
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 k 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 xx,k1:longint;
begin
 if y=x then cal:=a[0,x]
 else begin
   xx:=y-x;  k1:=0;  while xx > 1 do begin k1:=k1+1; xx:= xx shr 1; end;
   cal:=min(a[k1,xx],a[k1,y-(1 shl k1)+1]);
 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;
 k:=putere2;
 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.