Cod sursa(job #155973)

Utilizator filipbFilip Cristian Buruiana filipb Data 12 martie 2008 11:53:54
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 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; ((long int)1<<h) <= N; h++)
		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("%ld %ld", &x, &y);
		h = p[y-x+1];
		printf("%ld\n", minim(A[h][x], A[h][y-((long int)1<<h)+1]));
	}

	return 0;
}