Cod sursa(job #164860)

Utilizator vlad.maneaVlad Manea vlad.manea Data 24 martie 2008 21:39:56
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#define nmax 100005
#define logmax 20

int N, M, logN;

int RMQ[nmax][logmax], V[nmax];

int main()
{
	int i, l, a, b;

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

	scanf("%d%d", &N, &M);

	for (i = 1; i <= N; ++i)
		scanf("%d", &V[i]);

	for (logN = 0; (1<<logN) <= N; logN++);
	if ((1<<logN) > N) logN--;

	for (i = 1; i <= N; ++i)
		RMQ[i][0] = i;

	for (l = 1; l <= logN; ++l)
		for (i = 1, a = N-(1<<l)+1; i <= a; i++)
			RMQ[i][l] = V[RMQ[i][l-1]] < V[RMQ[i+(1<<(l-1))][l-1]] ?
				RMQ[i][l-1]: RMQ[i+(1<<(l-1))][l-1];

	while (M--)
	{
		scanf("%d%d", &a, &b);

		for (logN = 0, l = b-a+1; (1<<logN) <= l; logN++);
		if ((1<<logN) > b-a+1) logN--;

		printf("%d\n", V[V[RMQ[a][logN]] < V[RMQ[b-(1<<logN)+1][logN]]? RMQ[a][logN]: RMQ[b-(1<<logN)+1][logN] ]);
	}

	return 0;
}