Cod sursa(job #544996)

Utilizator BitOneSAlexandru BitOne Data 2 martie 2011 16:08:47
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
#define LOG2N_MAX 18

using namespace std;
int RMQ[N_MAX][LOG2N_MAX];
inline int _min( int x, int y ) { return ( x <= y ? x : y ); }
int log2N( int x )
{
	int l2x=1;
	for( ; (1<<l2x) <= x; ++l2x);
	return l2x-1;
}
int main( void )
{
	int N, l2N, M, i, idx, j, jdx;
	ifstream in( "rmq.in" );
	in>>N>>M;
	l2N=log2N(N);
	for( i=1; i <= N; ++i )
		in>>RMQ[0][i];
	for( i=1, idx=1; i <= l2N; ++i, idx*=2 )
	{
		jdx=N-2*idx+1;
		for( j=1; j <= jdx; ++j )
			RMQ[i][j]=_min( RMQ[i-1][j], RMQ[i-1][j+idx] );
	}
	ofstream out( "rmq.out" );
	for( ; M; --M )
	{
		in>>i>>j;
		l2N=log2N( j-i+1 );
		out<<_min( RMQ[l2N][i], RMQ[l2N][j-(1<<l2N)+1] )<<'\n';
	}
	return EXIT_SUCCESS;
}