Cod sursa(job #441397)

Utilizator mordredSimionescu Andrei mordred Data 12 aprilie 2010 21:48:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
// Simionescu Andrei, -/-/2010
// http://infoarena.ro/problema/rmq
// Dificultate: - 
// Categorii: -

#include <cstdio>
#include <vector>
using namespace std;
	
#define NMAX 100002
#define LOGNMAX 18	

int n, m;
int A[NMAX], RMQ[LOGNMAX][NMAX], M[NMAX];

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

	int i, j, k, x, y, aux, aux2;
    
    // input
	scanf( "%d %d", &n, &m );

	for ( i = 1; i <= n; ++i )
		scanf( "%d ", &A[i]);

    // initializare
	M[1] = 0;
	for ( i = 2; i <= n; ++i )
		M[i] = M[i/2] + 1;

	for ( i = 1; i <= n; ++i )
		RMQ[0][i] = A[i];
    
    // preprocesare
	for ( i = 1; (1<<i) <= n; ++i )
		for ( j = 1; j <= n - (1<<i) + 1; ++j )
		{
		  k = 1<<(i-1);
		  RMQ[i][j] = min( RMQ[i-1][j] , RMQ[i-1][j+k] );
		}

    // queries	
	for ( i = 1; i <= m; ++i )
	{
		scanf( "%d %d", &x, &y );
		
        aux = y - x + 1;
        k = M[aux];
		aux2 = aux - (1<<k);
		
        printf( "%d\n", min( RMQ[k][x], RMQ[k][x+aux2] ) );
	}
    	
	return 0;
}