Cod sursa(job #3313239)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 2 octombrie 2025 22:05:37
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <stdint.h>

const int32_t MAX_N = 100000;
const int32_t MAX_N_LOG_2 = 17;

int32_t rmq[MAX_N_LOG_2][MAX_N];

int32_t min(int32_t x, int32_t y) {
	return (x < y) ? x : y;
}
int32_t Log2(int32_t val) {
	int32_t res = 0;
	while((1 << res) <= val)
		++res;
	return res - 1;
}
int32_t GetMin(int32_t left, int32_t right) {
	int32_t len = right - left + 1;
	int32_t lenLog2 = Log2(len);
	int32_t lenPow2 = 1 << lenLog2;

	return min(rmq[lenLog2][left], rmq[lenLog2][right - lenPow2 + 1]);
}

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

	int32_t n, m;
	fin >> n >> m;
	for(int32_t i = 0; i != n; ++i)
		fin >> rmq[0][i];
	
	int32_t nLog2 = Log2(n);
	for(int32_t i = 1; i <= nLog2; ++i) {
		for(int32_t j = 0; j <= n - (1 << i); ++j)
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
	}

	for(int32_t i = 0; i != m; ++i) {
		int32_t a, b;
		fin >> a >> b;
		--a; --b;

		fout << GetMin(a, b) << '\n';
	}

	fin.close();
	fout.close();

	return 0;
}