Cod sursa(job #288161)

Utilizator Omega91Nicodei Eduard Omega91 Data 25 martie 2009 16:43:15
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <cmath>

const int NMAX = 100000;
int x[NMAX], N, M;
int rmq[NMAX][32];

inline int min(int a, int b)
{
	return a < b ? a : b;
}

void input()
{
	int i;
	scanf("%d %d", &N, &M);
	for (i = 1; i <= N; ++i)
		scanf("%d", x + i);
}

void preprocess()
{
	int i, j, n;
	for (j = 1; j <= N - 1; ++j)
		rmq[1][j] = min(x[j], x[j + 1]);
	n = (int)log2(N);
	for (i = 2; i <= n; ++i)
		for (j = 1; j <= N - (1 << i) + 1; ++j)
			rmq[i][j] = min( rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))] );
}

int query(int a, int b)
{
	if (a == b) return x[a];
	int k = (int)log2(b - a + 1);
	return min(rmq[k][a], rmq[k][b - (1 << k) + 1]);
}

int main()
{
	int m, a, b;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	input();
	preprocess();
	for (m = 0; m != M; ++m) {
		scanf("%d %d", &a, &b);
		printf("%d\n", query(a, b));
	}
	return 0;
}