Cod sursa(job #1130007)

Utilizator superman_01Avramescu Cristian superman_01 Data 28 februarie 2014 10:48:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

#define NMAX 100005
#define PMAX 18
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))

using namespace std;

ifstream in ( "rmq.in" );
ofstream out ( "rmq.out" );

int RMQ[PMAX][NMAX]  , Lg[NMAX] , N  , M ;

int main ( void )
{
	int i , j , x , y , diff;
	in >> N >> M ;
	for ( i = 1 ; i <= N ; ++i )
		in >> RMQ[0][i];
	for ( i = 2 ; i <= N ; ++i )
		Lg[i] = Lg[i/2]+1;
	for ( i = 1 ; ( 1<<i ) <= N ; ++i )
		for ( j = 1 ; j <=  N - ( 1<<i) + 1 ;++j )
			RMQ[i][j] = get_min ( RMQ[i-1][j] , RMQ[i-1][j + ( 1<<(i-1) ) ] );
	for ( i = 1 ; i <= M ; ++i )
	{
		in >> x >> y;
		diff = y - x + 1;
		int power = Lg[diff];
		out << get_min ( RMQ[power][x] , RMQ[power][y-(1<<power)+1] ) << "\n";
	}
	in.close();
	out.close();
	return 0 ;
}