Pagini recente » Cod sursa (job #2381438) | Cod sursa (job #2584230) | Cod sursa (job #2130912) | Cod sursa (job #3214909) | Cod sursa (job #312370)
Cod sursa(job #312370)
// Arhiva educationala - Range minimum Query
var
n, m, i, k, x, y, l, a, b : longint;
log : array[0..100000] of byte;
min : array[1..100000, 0..18] of longint;
f, g: text;
buf : array[1..65000] of byte;
function minim (a, b : longint) : longint;
begin
if (a < b) then minim := a else minim := b;
end;
begin
assign (f, 'rmq.in'); assign (g, 'rmq.out');
reset (f); rewrite (g);
settextbuf (f,buf);
readln (f, n, m);
for i := 1 to n do readln (f, min[i, 0]);
for i := 2 to n do log[i] := log[i shr 1] + 1;
for k := 1 to log[n] do
for i := 1 to n - (1 shl k) + 1 do
begin
min [i, k] := min[i, k-1];
b := min[i + (1 shl (k-1)), k-1];
if (min [i, k] > b) then
min [i, k] := b;
end;
for i := 1 to m do
begin
readln (f, x, y);
l := log[y - x + 1];
b := min[y + 1 - (1 shl l), l];
if (min[x, l] < b) then
writeln (g, min[x, l])
else
writeln (g, b);
end;
close (f); close (g);
end.