Cod sursa(job #384648)

Utilizator raduzerRadu Zernoveanu raduzer Data 20 ianuarie 2010 17:13:41
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.65 kb
#include <cstdio>

int n, m;
int d[100010][20];

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

int main()
{
	int i, pow, j, x, y;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);

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

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

	for (pow = 0; 1 << (pow + 1) <= n; ++pow);

	for (j = 1; j <= pow; ++j)
		for (i = 1; i <= n; ++i)
			d[i][j] = min(d[i][j - 1], (i + (1 << (j - 1)) <= n) ? d[i + (1 << (j - 1))][j - 1] : d[i][j - 1]);

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

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

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