Cod sursa(job #154162)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 10 martie 2008 22:40:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <algorithm>

#include <cstdio>

using namespace std;

#define FOR(i, a, b) for(int i = (int)(a); i < (int)(b); ++i)

#define MAXN 100005
#define MAXlogN 17

int N, M;
int Min[MAXlogN][MAXN];

int lg[MAXN];

int main()
{
	freopen("rmq.in", "rt", stdin);
	freopen("rmq.out", "wt", stdout);

	scanf("%d %d", &N, &M);
	FOR(i, 0, N)
		scanf("%d", Min[0] + i);

	FOR(k, 1, MAXlogN)
		FOR(i, 0, N)
			if (i + (1 << (k - 1)) < N)
				Min[k][i] = min( Min[k - 1][i], Min[k - 1][i + (1 << (k - 1))] );
			else
				Min[k][i] = Min[k - 1][i];

	for (int i = 1, j = 0; i < MAXN; i++)
	{
		if (i == (1 << (j + 1)))
			j++;

		lg[i] = j;
	}

	FOR(i, 0, M)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		x--; y--;

		int len = y - x + 1;
		printf("%d\n", min( Min[ lg[len] ][x], Min[ lg[len] ][y - (1 << lg[len]) + 1] ));
	}

	return 0;
}