Cod sursa(job #373250)

Utilizator TabaraTabara Mihai Tabara Data 13 decembrie 2009 04:50:47
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>
using namespace std;

#define in "rmq.in"
#define out "rmq.out"
#define NMAX 100005
#define MMAX 18

int dp[NMAX][MMAX];
int N, M;
int A[NMAX], lg[NMAX];

template <typename T>
T minim(T a, T b ) {
	return ((a)<(b)?(a):(b));
}

int main ( void )
{
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf ( "%d%d", &N, &M );

	int i, j, X, Y, k;

	for ( i = 0; i < N; scanf( "%d", A+i++ ) );

	lg[1] = 0;
	for ( i = 2; i < N; ++i ) lg[i] = lg[(i>>1)]+1;

	for ( i = 0; i < N; ++i )
		dp[i][0] = i;

	for ( j = 1; (1<<j) <= N; ++j )
		for ( i = 0; i + (1<<j)-1 < N; ++i )
			if ( A[dp[i][j-1]] < A[dp[i+(1<<(j-1))][j-1]] )
				dp[i][j] = dp[i][j-1];
			else
				dp[i][j] = dp[i+(1<<(j-1))][j-1];

	for ( ; M; --M )
	{
		scanf ( "%d%d", &X, &Y );
		X--; Y--;
		k = lg[Y-X+1];
		if ( A[dp[X][k]] < A[dp[Y-(1<<k)+1][k]] )
			printf ( "%d\n", A[dp[X][k]] );
		else
			printf ( "%d\n", A[dp[Y-(1<<k)+1][k]] );
	}

	return 0;
}