Cod sursa(job #1324812)

Utilizator YoChinezuWeng Mihai Alexandru YoChinezu Data 22 ianuarie 2015 20:24:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.65 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int dp[100005][18], lo[100005];

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

	int n, m, x, y, k;
	scanf("%d%d", &n, &m);

	for(int i = 1; i <= n; ++ i) {
		scanf("%d", &x);
		dp[i][0] = x;
	}
	for(int j = 1; (1 << j) <= n; ++ j) {
		for(int i = 1; i <= n - (1 << j) + 1; ++ i) {
			dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
		}
	}

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

	for(int i = 1; i <= m; ++ i) {
		scanf("%d%d", &x, &y);
		k = lo[y - x + 1];
		printf("%d\n", min(dp[x][k], dp[y - (1 << k) + 1][k]));
	}

	return 0;
}