Cod sursa(job #202324)

Utilizator cypherMircea Grecu cypher Data 7 august 2008 13:36:30
Problema Range minimum query Scor 80
Compilator fpc Status done
Runda Arhiva educationala Marime 0.9 kb
program range_minimum_query;
var a:array[1..100010] of longint;
	p:array[0..18,1..100010] of longint;
	l:array[1..100010] of word;
	n,m:longint;
	
	function min(x,y:longint):longint;
	begin if x<y then min:=x else min:=y; end;
	
	procedure createtable;
	var i,j,x:longint;
	begin
		for i:=1 to n do p[0,i]:=a[i];
		x:=1;
		for j:=1 to l[n] do begin
			for i:=1 to n+1-(x shl 1) do begin
				p[j,i]:=min(p[j-1,i],p[j-1,i+x]);
			end;
			x:=x shl 1;
		end;
	end;
	
	procedure main;
	var f,g:text; 
		i,j,u,v:longint;
		x:byte;
	begin
		assign(f,'rmq.in'); reset(f);
		assign(g,'rmq.out'); rewrite(g);
		readln(f,n,m);
		for i:=1 to n do readln(f,a[i]);
		l[1]:=0;
		for i:=2 to n do l[i]:=l[i shr 1]+1;
		createtable;				
		for i:=1 to m do begin
			readln(f,u,v);
			x:=l[v-u+1];
			writeln(g,min(p[x,u],p[x,v+1-(1 shl x)]));
		end;
		close(f); close(g);
	end;
	
BEGIN
	main;
END.