Cod sursa(job #3288394)

Utilizator WilIiamperWilliam Damian Balint WilIiamper Data 21 martie 2025 22:18:57
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <iostream>

using namespace std;

#define MAXN 100005
#define LOG_BASE_2 18
int n, m, v[MAXN], range_min[LOG_BASE_2][MAXN];

int RMQ(int left, int right) {
	if (left == right)
		return v[left];

	int len = (right - left + 1);
	int log_base_2 = 0;
	while ((1 << log_base_2) < len)
		log_base_2++;
	log_base_2--;
	int pow2 = 1 << (log_base_2);

	return min(
		range_min[log_base_2][left],
		range_min[log_base_2][right - pow2 + 1]
	);
}

void Precompute() {
	for (int i = 1; i <= n; i++)
		range_min[0][i] = v[i];

	for (int exp = 1; exp < LOG_BASE_2; exp++) {
		for (int i = 1; i + (1 << exp) - 1 <= n; i++) {
			range_min[exp][i] = min(
				range_min[exp - 1][i], 
				range_min[exp - 1][i + (1 << (exp-1))]
			);
		}
	}
}

int main() {
	ifstream fin("rmq.in");
	ofstream fout("rmq.out");
	fin >> n >> m;
	for (int i = 1; i <= n; i++)
		fin >> v[i];

	Precompute();

	int left, right;
	while (m--) {
		fin >> left >> right;
		fout << RMQ(left, right) << "\n";
	}
	return 0;
}