Cod sursa(job #155961)

Utilizator filipbFilip Cristian Buruiana filipb Data 12 martie 2008 11:48:26
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>

#define minim(a, b) ((a < b) ? a : b)
#define NMax 100005

long int N, M, A[18][NMax], p[NMax];

int main(void)
{
	long int i, x, y, h;

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

	scanf("%ld %ld", &N, &M);
	for (i = 1; i <= N; ++i)
		scanf("%ld", &A[0][i]);

	for (h = 1; h <= N; h <<= 1)
		for (i = 1; i <= N; ++i)
		{
			A[h][i] = A[h-1][i];
			if (i+((long int)1<<(h-1)) <= N)
				A[h][i] = minim(A[h][i], A[h-1][i+((long int)1<<(h-1))]);
		}

	for (i = 2; i <= N; ++i)
		p[i] = p[i/2] + 1;

	for (; M; --M)
	{
		scanf("%d %d", &x, &y);
		h = p[y-x+1];
		printf("%ld\n", minim(A[h][x], A[h][y-((long int)1<<h)+1]));
	}

	return 0;
}