Pagini recente » Cod sursa (job #1539830) | Cod sursa (job #40487) | Cod sursa (job #1528729) | Cod sursa (job #493036) | Cod sursa (job #307003)
Cod sursa(job #307003)
Program Rmq;
var Intrare,Iesire : text;
a,log2 : array[1..100000] of longint;
mk : array[0..16,1..100000] of longint;
d : array[0..16] of longint;
n,m : longint;
procedure DeschideFisiere;
begin
assign(Intrare,'rmq.in');
reset(Intrare);
assign(Iesire,'rmq.out');
rewrite(Iesire);
end;
function min(x,y : longint) : longint;
begin
if x<y then min:=x else min:=y;
end;
procedure preprocesare;
var i,k : longint;
begin
d[0]:=1;
for i:=1 to 16 do d[i]:=2*d[i-1];
for i:=1 to n do log2[i]:=0;
for i:=0 to 16 do log2[d[i]]:=i;
k:=0;
for i:=1 to n do
if log2[i]=0 then log2[i]:=k else k:=log2[i];
for i:=1 to n do mk[0,i]:=a[i];
for k:=1 to log2[n] do begin
for i:=1 to n do
if n-i+1>d[k-1] then mk[k,i]:=min(mk[k-1,i],mk[k-1,i+d[k-1]])
else mk[k,i]:=mk[k-1,i];
end;
end;
function minim(x,y : longint) : longint;
var l : longint;
begin
l:=log2[y-x+1];
minim:=min(mk[l,x],mk[l,y-d[l]+1]);
end;
procedure proceseaza;
var i,x,y : longint;
begin
readln(Intrare,n,m);
for i:=1 to n do readln(Intrare,a[i]);
preprocesare;
for i:=1 to m do begin
readln(Intrare,x,y);
writeln(Iesire,minim(x,y));
end;
end;
procedure InchideFisiere;
begin
close(Intrare);
close(Iesire);
end;
begin
DeschideFisiere;
proceseaza;
InchideFisiere;
end.