Cod sursa(job #160144)

Utilizator marinaMarina Horlescu marina Data 14 martie 2008 19:33:47
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
//Range minimum query
#include <stdio.h>
#define INPUT "rmq.in"
#define OUTPUT "rmq.out"
#define MAXN 100001
#define MAXM 1000001
#define MAX 32

int N, m;
int A[MAXN];

int M[MAXN][MAX]; //indicele 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[i][0] = i;
	for(j = 1; 1<<j <= N; ++j)
		for(i = 1; i + (1<<j)-1 <= N; ++i) 
			if(A[M[i][j-1]] < A[M[i+(1<<j-1)][j-1]])
				M[i][j] = M[i][j-1];
			else M[i][j] = M[i+(1<<j-1)][j-1];
	
	for(i = 1; i <= m; ++i)
	{
		int x,y;
		scanf("%d %d", &x, &y);
		int k = lg[y-x+1];
		if(A[M[x][k]] < A[M[y-(1<<k)+1][k]]) printf("%d\n", A[M[x][k]]);
		else printf("%d\n", A[M[y-(1<<k)+1][k]]);
	}		
	return 0;
}