Cod sursa(job #673985)

Utilizator BitOneSAlexandru BitOne Data 5 februarie 2012 13:06:28
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include <fstream>
#include <cstdlib>
#define N_MAX 100011
#define LOGN_MAX 17

using namespace std;

int RMQ[LOGN_MAX][N_MAX];

inline int _min( int x, int y ) { return x <= y ? x : y; }
inline int log2( int x ) { return 8*sizeof(int) - __builtin_clz(x) - 1; }
int main()
{
	int N, M, i, j, k, till, lastK;
	ifstream in( "rmq.in" );
	ofstream out( "rmq.out" );
	
	in>>N>>M;
	for( j=1; j <= N; ++j )
		in>>RMQ[0][j];
	for( i=1, k=2; k <= N; ++i, k<<=1 )
	{
		till=N-k+1;
		lastK=k>>1;
		for( j=1; j <= till; ++j )
			RMQ[i][j]=_min( RMQ[i-1][j], RMQ[i-1][lastK+j] );
	}
	for( ; M; --M )
	{
		in>>k>>j;
		i=log2( j-k+1 );
		out<<_min( RMQ[i][k], RMQ[i][j-(1<<i)+1] )<<'\n'; 
	}
	
	return EXIT_SUCCESS;
}