Cod sursa(job #175251)

Utilizator amadaeusLucian Boca amadaeus Data 9 aprilie 2008 19:19:44
Problema Range minimum query Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>

#define NX 100010
#define SQ 400
#define INF 0x3f3f3f3f

int N, M, v[ NX ], w[ SQ ], sq, i, k, x, y, min;

inline int MIN( int x, int y ) {
	return x < y ? x : y;
}

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

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

	for( sq = 1; sq*sq <= N; sq++ );
	sq--;

	for( i = k = 0, min = INF; i < N; i++ ) {
		min = MIN( min, v[i] );
		if( i % sq == sq-1 )
			w[ k++ ] = min, min = INF;
	}
	
	while( M-- ) {
		scanf( "%d%d", &x, &y );

		x--, y--, min = INF;
		for( i = x; i%sq != 0 && i <= y; i++ )
			min = MIN( min, v[i] );
			
		for( ; i+sq <= y+1; i += sq )
			min = MIN( min, w[ i/sq ] );

		for( ; i <= y; i++ )
			min = MIN( min, v[i] );

		printf( "%d\n", min );
	}
}

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

	cit();

	return 0;
}