Cod sursa(job #2511900)

Utilizator radustn92Radu Stancu radustn92 Data 20 decembrie 2019 02:25:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <algorithm>
using namespace std;

const int NMAX = 100505;
const int LMAX = 17;

int minV[LMAX][NMAX];
int lg[NMAX];
int N, queries;

void precompute() {
	for (int i = 2; i <= N; i++) {
		lg[i] = lg[i >> 1] + 1;
	}

	for (int idx = 1; (1 << idx) <= N; idx++) {
		for (int start = 1; start <= N - (1 << idx) + 1; start++) {
			minV[idx][start] = min(minV[idx - 1][start], minV[idx - 1][start + (1 << (idx - 1))]);
		}
	}
}

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

	scanf("%d%d", &N, &queries);
	for (int i = 1; i <= N; i++) {
		scanf("%d", &minV[0][i]);
	}
	precompute();

	int x, y;
	for (int query = 0; query < queries; query++) {
		scanf("%d%d", &x, &y);
		int log2Value = lg[y - x + 1];
		printf("%d\n", min(minV[log2Value][x], minV[log2Value][y - (1 << log2Value) + 1]));
	}

	return 0;
}