Cod sursa(job #809813)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 9 noiembrie 2012 02:34:37
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#include <algorithm>

using namespace std;

inline int next_int() {
	int d;
	scanf("%d", &d);
	return d;
}

int H = 1;
int ST[1 << 20];

int get(int root, int left, int right, int a, int b) {
	if (left == a && b == right) {
		return ST[root];
	}
	int mid = left + right >> 1;
	if (b <= mid) {
		return get(root << 1, left, mid, a, b);
	}
	if (mid <= a) {
		return get(root << 1 | 1, mid, right, a, b);
	}
	return min(get(root << 1, left, mid, a, mid), get(root << 1 | 1, mid, right, mid, b));
}

int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	int N = next_int();
	int M = next_int();
	while ((1 << H) < N) {
		H++;
	}
	for (int i = 0; i < N; i++) {
		ST[i + (1 << H)] = next_int();
	}
	for (int i = (1 << H) - 1; i; i--) {
		ST[i] = min(ST[i << 1], ST[i << 1 | 1]);
	}
	for (int i = 0; i < M; i++) {
		int a = next_int() - 1;
		int b = next_int();
		printf("%d\n", get(1, 0, 1 << H, a, b));
	}
	return 0;
}