Cod sursa(job #900219)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 28 februarie 2013 18:20:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <cstdio>

#define NMAX 100001
#define LGMAX 18

int N, M, i, j, st, dr, logct;
int D[LGMAX][NMAX];
int Log[NMAX];

inline int MIN( int a, int b )
{
	if( a < b ) return a;
	return b;
}

int main()
{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	
	scanf("%d%d", &N, &M);
	
	Log[0] = -1;
	for( i = 1; i <= N; ++i )
	{
		scanf("%d", &D[0][i]);
		Log[i] = Log[i>>1] + 1;
	}
	
	for( i = 1; i <= Log[N]; ++i )
		for( j = 1; j <= N - (1<<(i-1)); ++j )
			D[i][j] = MIN( D[i - 1][j], D[i - 1][j + (1<<(i-1))] );
	
	while( M-- )
	{
		scanf("%d%d", &st, &dr);
		logct = Log[dr - st + 1];
		printf("%d\n", MIN( D[logct][st], D[logct][dr - (1<<logct) + 1] ));
	}
	
	return 0;
}