Pagini recente » Cod sursa (job #680319) | Cod sursa (job #2166835) | Cod sursa (job #131658) | Cod sursa (job #1102447) | Cod sursa (job #306996)
Cod sursa(job #306996)
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,mn : longint;
begin
l:=log2[y-x+1];
mn:=mk[l,x];
x:=x+d[l];
while x<=y do begin
l:=log2[y-x+1];
mn:=min(mk[l,x],mn);
x:=x+d[l];
end;
minim:=mn;
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.