Cod sursa(job #1098861)

Utilizator pulseOvidiu Giorgi pulse Data 5 februarie 2014 12:04:36
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 100002
#define LMAX 18

long int n, m;
long int a[NMAX], lg[NMAX], rmq[18][NMAX];

int main ()
{
	long int i, j, l;

	freopen ("rmq.in", "r", stdin);
	freopen ("rmq.out", "w", stdout);
	scanf ("%ld %ld", &n, &m);
	for (i = 1; i <= n; ++i) scanf ("%ld", &a[i]);

	lg[1] = 0;
	for (i = 2; i <= n; ++i)
		lg[i] = lg[i / 2] + 1;

	for (i = 1; i <= n; ++i)
		rmq[0][i] = a[i];

	for (i = 1; (1 << i) <= n; ++i)
	{
		for (j = 1; j <= n - (1 << i) + 1; ++j)
		{
			l = 1 << (i - 1);
			rmq[i][j] = min (rmq[i - 1][j], rmq[i - 1][j + l]);
		}
	}

	long int x, y, diff, sh;

	while (m--)
	{
		scanf ("%ld %ld", &x, &y);
		diff = y - x + 1;
		l = lg[diff];
		sh = diff - (1 << l);
		printf ("%ld\n", min (rmq[l][x], rmq[l][x + sh]));
	}
	return 0;
}