Mai intai trebuie sa te autentifici.
Cod sursa(job #184080)
Utilizator | Data | 22 aprilie 2008 23:28:37 | |
---|---|---|---|
Problema | Range minimum query | Scor | 80 |
Compilator | fpc | Status | done |
Runda | Arhiva educationala | Marime | 1.21 kb |
program p_rmq;
const MAXL = 16;
MAXN = 100000;
var f,fout:text;
n,m,i,k,a,b,lg:longint;
exp:array[0..MAXL] of longint;
log:array[1..MAXN] of longint;
rmq:array[0..MAXL,1..MAXN] of longint;
function min(a,b:longint):longint;
begin
if(a<b) then min:=a
else min:=b;
end;
begin
exp[0]:=1;
for i:=1 to MAXL do
exp[i]:=2*exp[i-1];
log[1]:=0;
assign(fout,'rmq.out');
assign(f,'rmq.in');
rewrite(fout);
reset(f);
readln(f,n,m);
for i:=2 to n do
log[i]:=log[i div 2]+1;
for i:=1 to n do
readln(f,rmq[0,i]);
for k:=1 to log[n] do
begin
i:=1;
while(i+exp[k]-1 <= n) do
begin
if (rmq[k-1,i] < rmq[k-1,i+exp[k-1]]) then
rmq[k,i]:=rmq[k-1,i] else
rmq[k,i]:=rmq[k-1,i+exp[k-1]];
inc(i);
end;
end;
for i:=1 to m do
begin
readln(f,a,b);
lg:=log[b-a+1];
if (rmq[lg,a] < rmq[lg,b-exp[lg]+1]) then
writeln(fout,rmq[lg,a]) else
writeln(fout,rmq[lg,b-exp[lg]+1]);
end;
close(f);
close(fout);
end.