Cod sursa(job #175534)

Utilizator amadaeusLucian Boca amadaeus Data 10 aprilie 2008 00:30:04
Problema Range minimum query Scor 100
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[ LX ][ NX ], 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[0][i] = i;
		
	for( j = 1, k = 2; k <= N; j++, k <<= 1 )
		for( i = 1; i+k <= N+1; i++ )
			a[j][i] = ( v[ a[j-1][i] ] < v[ a[j-1][ i + (k>>1) ] ] ) ? a[j-1][i] : a[j-1][ i + (k>>1) ];

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

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

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

	cit();

	return 0;
}