Cod sursa(job #160149)

Utilizator marinaMarina Horlescu marina Data 14 martie 2008 19:43:54
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
//Range minimum query
#include <stdio.h>
#define INPUT "rmq.in"
#define OUTPUT "rmq.out"
#define MAXN 100001
#define MAXM 1000001
#define MAX 32
#define minim(a,b) ((a)<(b)?(a):(b))

int N, m;
int A[MAXN];

int M[MAX][MAXN]; //M[j][i] - elem din A minim in secventa din A ce incepe de pe poz i de lung 2^j
int lg[MAXN];

int main()
{
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);
	
	scanf("%d %d", &N, &m);
	
	int i, j;
	for(i = 1; i <= N; ++i) scanf("%d", &A[i]);

//Preprocesare	
	for(i = 2; i <= N; ++i)
		lg[i] = lg[i/2] + 1;
	for(i = 1; i <= N; ++i)
		M[0][i] = A[i];
	for(j = 1; 1<<j <= N; ++j)
		for(i = 1; i + (1<<j)-1 <= N; ++i) 
				M[j][i] = minim(M[j-1][i], M[j-1][i+(1<<j-1)]);
	
	for(i = 1; i <= m; ++i)
	{
		int x,y;
		scanf("%d %d", &x, &y);
		int k = lg[y-x+1];
		printf("%d\n", minim(M[k][x], M[k][y-(1<<k)+1]));
	}		
	return 0;
}