Cod sursa(job #175533)

Utilizator amadaeusLucian Boca amadaeus Data 10 aprilie 2008 00:24:41
Problema Range minimum query Scor 90
Compilator c Status done
Runda Arhiva educationala Marime 0.74 kb
#include <stdio.h>

#define NX ( 1<<17 )
#define LX 17

int N, M, a[ NX ][ LX ], v[ NX ];
int i, j, k, x, y;

void cit() {
	
	scanf( "%d%d", &N, &M );

	for( i = 1; i <= N; i++ )
		scanf( "%d", v+i );

	for( i = 1; i <= N; i++ )
		a[i][0] = i;
		
	for( j = 1, k = 2; k <= N; j++, k <<= 1 )
		for( i = 1; i+k <= N+1; i++ )
			a[i][j] = ( v[ a[i][j-1] ] < v[ a[ i + (k>>1) ][j-1] ] ) ? a[i][j-1] : a[ i + (k>>1) ][j-1];

	while( M-- ) {
		scanf( "%d%d", &x, &y );
		
		for( k = 1; (1<<k) < y - x + 1; k++ ); k--;

		printf( "%d\n", v[ a[x][k] ] < v[ a[y-(1<<k)+1][k] ] ? v[ a[x][k] ] : v[ a[y-(1<<k)+1][k] ] );
	}
}

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

	cit();

	return 0;
}