Cod sursa(job #175265)

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

#define NX (1 << 17)
#define INF 0x3f3f3f3f

int N, M, v[ NX ], T[ NX << 1 ], x, y;

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

void build( int n, int l, int r ) {
	int m;
	
	if( l == r )
		T[n] = v[l];
	else {
		m = (l+r) >> 1;
		build( n<<1, l, m );
		build( (n<<1)+1, m+1, r );
		T[n] = MIN( T[ n<<1 ], T[ (n<<1) + 1 ] );
	}
}

int query( int n, int l, int r ) {
	int m, min;
	
	if( x <= l && r <= y )
		return T[ n ];
		
	m = (l+r) >> 1; min = INF;

	if( m >= x )
		min = MIN( min, query( n<<1, l, m ) );
	if( m < y )
		min = MIN( min, query( (n<<1)+1, m+1, r ) );

	return min;
}

void cit() {
	int i;
	
	scanf( "%d%d", &N, &M );
	
	for( i = 1; i <= N; i++ )
		scanf( "%d", v + i );

	build( 1, 1, N );

	while( M-- ) {
		scanf( "%d%d", &x, &y );
		printf( "%d\n", query( 1, 1, N ) );
	}
}

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

	cit();

	return 0;
}