Cod sursa(job #164871)

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

int N, M;

int RMQ[logmax][nmax], V[nmax], log[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 (i = 2; i <= N; ++i)
	{
		log[i] = log[i-1];
		log[i] += 1<<(log[i]+1) <= i;
	}

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

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

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

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

	return 0;
}