Cod sursa(job #628381)

Utilizator ContraPunctContrapunct ContraPunct Data 1 noiembrie 2011 11:33:46
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
#define Log2N_MAX 19

using namespace std;
int RMQ[Log2N_MAX][N_MAX];
inline int _min( int x, int y ) 
{
	if( x <= y )
		return x;
	return y;
}
inline int Log2(int N ) { return 31-__builtin_clz(N); }
int main( void )
{
	int N, M, i, j, k, till, a, b, log2N;
	ifstream in( "rmq.in" );
	in>>N>>M;
	for( i=1; i <= N; ++i )
		in>>RMQ[0][i];
	log2N=Log2(N);
	for( i=1, j=1; i <= log2N; ++i, j<<=1 )
	{
		till=N-(j<<1)+1;
		for( k=1; k <= till; ++k )
			RMQ[i][k]=_min( RMQ[i-1][k], RMQ[i-1][k+j] );
	}
	ofstream out( "rmq.out" );
	for( ; M; --M )
	{
		in>>a>>b;
		k=Log2( b-a+1 );
		out<<_min( RMQ[k][a], RMQ[k][b-(1<<k)+1] )<<'\n';
	}
	return EXIT_SUCCESS;
}