Cod sursa(job #180058)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 16 aprilie 2008 16:39:52
Problema Range minimum query Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 1.04 kb
program rmq;
var A : array [0..100000,0..20] of longint;
    v,lg : array [0..100000] of longint;
    p : array [0..20] of longint;
    f,g : text;
    n,m,i : longint;
procedure init;
var i,j : longint;
begin
assign(f,'rmq.in');
reset(f);
assign(g,'rmq.out');
rewrite(g);
readln(f,n,m);
for i := 1 to n do
readln(f,v[i]);
end;

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

procedure solve;
var i,j,put,x,y : longint;
begin
x := 1;
put := 0;
lg[1] := 0;
p[0] := 1;
for i := 2 to 100000 do begin
if 2*x<=i then begin
                x := 2*x;
                inc(put);
                p[put] := x;
                end;
lg[i] := put;
end;
p[put+1] := 2*x;

for i := n downto 1 do begin
a[i,0] := v[i];
j:= 1;
while i+p[j]<=n+1 do begin
a[i,j] := min(a[i,j-1],a[i+p[j-1],j-1]);
j := j+1;
end;
end;

for i := 1 to m do begin
readln(f,x,y);
writeln(g,min(a[x,lg[y-x+1]],a[y-p[lg[y-x+1]]+1,lg[y-x+1]]));
end;

end;

begin
init;
solve;

close(f);
close(g);
end.