Cod sursa(job #2796365)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 7 noiembrie 2021 22:42:37
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>

#define Forward(x) std::forward<decltype(x)>(x)

template<typename T>
class SqrtDecomp {
public:
	SqrtDecomp(auto&& values) : values(Forward(values)) {
		n = this->values.size();
		BUCK = sqrt(n);

		buildBuckets();
	}

	SqrtDecomp() = delete;

	T query(int l, int r) const {
		T answer = INF;
		while (l % BUCK != 0 && l <= r) {
			answer = std::min(answer, values[l]);
			l++;
		}
		while (r % BUCK != BUCK - 1 && l <= r) {
			answer = std::min(answer, values[r]);
			r--;
		}
		while (l <= r) {
			answer = std::min(answer, buckets[getBuckIdx(l)]);
			l += BUCK;
		}
		return answer;
	}

private:
	int getBuckIdx(int pos) const {
		return pos / BUCK;
	}

	void buildBuckets() {
		buckets.resize(getBuckIdx(n - 1) + 1, INF);

		for (std::size_t i = 0; i < n; i++) {
			int idx = getBuckIdx(i);
			buckets[idx] = std::min(buckets[idx], values[i]);
		}
	}

private:
	std::size_t n;
	std::vector<T> values;
	std::vector<T> buckets;

	int BUCK;

	const T INF = std::numeric_limits<T>::max();
};

int main() {
	std::ifstream fin("rmq.in");
	std::ofstream fout("rmq.out");

	std::ios::sync_with_stdio(false);
	fin.tie(0), fout.tie(0);

	int n, m;
	fin >> n >> m;

	std::vector<int> values(n);
	for (auto& itr : values) {
		fin >> itr;
	}

	SqrtDecomp<int> decomp(std::move(values));

	while (m--) {
		int l, r;
		fin >> l >> r;
		l--, r--;

		fout << decomp.query(l, r) << "\n";
	}


	return 0;
}