Cod sursa(job #615278)

Utilizator BitOneSAlexandru BitOne Data 9 octombrie 2011 09:14:34
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 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 ) {return x <= y ? x : 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] );
	}
	for( ofstream out( "rmq.out" ); 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;
}