Cod sursa(job #587540)

Utilizator gicu_01porcescu gicu gicu_01 Data 5 mai 2011 07:10:02
Problema Range minimum query Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.28 kb
var a:array[0..20,1..1000000]of longint;
    buf:array[1..1000000]of longint;
    buf2:array[1..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;

procedure afis;
var i,j:longint;
begin
 for i:=0 to 17 do
  begin
   for j:=1 to n do write(a[i,j],' ');
   writeln;
  end;
end;


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

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



begin
 putere;
 body;
end.