Cod sursa(job #312370)

Utilizator belgun_adrianBelgun Dimitri Adrian belgun_adrian Data 5 mai 2009 20:51:15
Problema Range minimum query Scor 90
Compilator fpc Status done
Runda Arhiva educationala Marime 0.96 kb
// 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.