Cod sursa(job #485239)

Utilizator raduzerRadu Zernoveanu raduzer Data 17 septembrie 2010 18:01:01
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_N = 100001;
const int MAX_P = 20;

int n, m;
int a[MAX_N][MAX_P];

int main()
{
	int i, k, x, y;

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

	scanf("%d %d", &n, &m);

	int pow = 1, pt = 0;

	for (; (pow << 1) <= n; pow <<= 1, ++pt);

	for (k = 0, pow = 1; k <= pt; ++k, pow <<= 1)
		for (i = 1; i <= n; ++i)
			if (k == 0)
				scanf("%d", &a[i][k]);
			else 
				if (i + (pow >> 1) <= n)
					a[i][k] = min(a[i][k - 1], a[i + (pow >> 1)][k - 1]);
				else
					a[i][k] = a[i][k - 1];

	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d", &x, &y);

		for (k = 0, pow = 1; (pow << 1) <= (y - x); pow <<= 1, ++k);

		printf("%d\n", min(a[x][k], a[y - pow + 1][k]));
	}
}