Cod sursa(job #3030587)

Utilizator the_horoHorodniceanu Andrei the_horo Data 17 martie 2023 18:55:56
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>
using namespace std;

namespace rmq {
	namespace {
		array<array<int, 100'000>, 21> data;
	}

	void build (const std::vector<int> &v) {
		const int n = v.size() - 1;

		for (int j = 1; j <= n; ++ j)
			data[0][j] = v[j];

		for (int i = 1, step = 1 << i; step <= n; ++ i, step <<= 1) {
			const int half = step >> 1;

			for (int j = 1; j + step - 1 <= n; ++ j)
			    data[i][j] = min(data[i - 1][j], data[i - 1][j + half]);
		}
	}

	int query (int left, int right) {
		const int level = log2(right - left + 1);

		return min(data[level][left], data[level][right - (1 << level) + 1]);
	}
}

int main () {
	ifstream in("rmq.in");
	in.exceptions(in.failbit);
	ofstream out("rmq.out");
	out.exceptions(out.failbit);

	int n, m;
	in >> n >> m;

	vector<int> v(n + 1);
	for (int i = 1; i <= n; ++ i)
		in >> v[i];

	rmq::build(v);

	for (int i = 0; i < m; ++ i) {
		int x, y;
		in >> x >> y;
		out << rmq::query(x, y) << '\n';
	}
}