Cod sursa(job #1909551)

Utilizator lflorin29Florin Laiu lflorin29 Data 7 martie 2017 13:03:28
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

using namespace std;

const int nMax = 100009;
const int logNmax = log2(nMax + 1);

int n, m, a[nMax];
int rmq[logNmax][nMax];
int preLog[nMax];

void calcprelog() {
	for (int i = 2; i <= n; ++i)
		preLog[i] = preLog[i >> 1] + 1;
}
void buildrmq() {
	for (int i = 1; i <= n; ++i)
		rmq[0][i] = a[i];

	for (int i = 1; (1 << i) <= n; ++i) {
		int len = (1 << i);

		for (int j = 1; j + len - 1 <= n; ++j) {
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + len / 2]);
		}
	}
}

int Query(int i, int j) {
	int dif = j - i + 1;
	int logDif = preLog[dif];
	return min(rmq[logDif][i], rmq[logDif][j - (1 << logDif) + 1]);
}


int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	scanf("%d%d", &n, &m);

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

	calcprelog();
	buildrmq();

	for (int i = 1; i <= m; ++i) {
		int x, y;
		scanf("%d%d", &x, &y);
		printf("%d\n", Query(x, y));
	}

	return 0;
}