Cod sursa(job #634950)

Utilizator sebii_cSebastian Claici sebii_c Data 17 noiembrie 2011 23:33:25
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.75 kb
#include <stdio.h>
#define NMAX 100000
#define LgMax 18

int RMQ[NMAX][LgMax];
int A[NMAX], lg[NMAX];

inline int min(int a, int b)
{
	return (a<b)?a:b;
}

int main()
{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	int n, m, i, j, k, nMin, x, y;
	scanf("%d %d", &n, &m); 
	
	for (i=1; i<=n; ++i)
		scanf("%d", &A[i]);
	
	lg[1] = 0;
	for (i=2; i<=n; ++i)
		lg[i] = lg[i/2] + 1;
	
	for (i=1; i<=n; ++i)
		RMQ[i][1] = A[i];

	for (i=1; i<=n; ++i)
		for (j=2; j<=lg[n]; ++j) 
			RMQ[i][j] = min(RMQ[i][j-1], RMQ[i + (1<<(j-1))][j-1]);
		
	for (i=1; i<=m; ++i) {
		scanf("%d %d", &x, &y);
		k = y - x + 1;
		j = lg[k];
		nMin = min(RMQ[x][j], RMQ[x+k-(1<<j)+1][j]);
		printf("%d\n", nMin);
	}
	return 0;
}