Cod sursa(job #584041)

Utilizator coderninuHasna Robert coderninu Data 23 aprilie 2011 18:55:33
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <cstdio>
#define Nmax 100000
#define LogN 20

using namespace std;

int N, M, x, y;
int v[Nmax][LogN];

inline int min(const int &x, const int &y) { return x < y ? x : y; }

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

	scanf("%d %d\n", &N, &M);
	for (int i = 0; i < N; ++i) scanf("%d\n", &v[i][0]);

	for (int k = 1; (1 << k) - 1 < N; ++k) {
		for (int i = 0; i < N; ++i) {
			if (i + (1 << k) - 1 >= N) break;
			v[i][k] = min(v[i][k-1], v[i + (1 << (k - 1))][k-1]);
		}
	}

	while (M--) {
		scanf("%d %d\n", &x, &y);
		--x; --y;
		for (int k = 0; 1; ++k) {
			if (x + (1 << (k + 1)) - 1 > y) {
				printf("%d\n", min(v[x][k], v[y - (1 << k) + 1][k]));
				break;
			}
		}
	}
	return 0;
}