Cod sursa(job #3224734)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 15 aprilie 2024 23:23:39
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include<fstream>

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

const int MAX = 1e5 + 5;
const int LOG_MAX = 20;

int n, m, rmq[LOG_MAX][MAX], E[MAX];

void init() {
	fin >> n >> m;
	for (int j = 1; j <= n; ++j)
		fin >> rmq[0][j];

	for (int i = 1; (1<<i) <= n; ++i)
		for (int j = 1; j <= n; ++j) {
			rmq[i][j] = rmq[i - 1][j];
			int p = j + (1<<(i - 1));
			if (p <= n and rmq[i][j] > rmq[i - 1][p])
				rmq[i][j] = rmq[i - 1][p];
		}

	E[1] = 0;
	for (int i = 2; i <= n; ++i)
		E[i] = 1 + E[i / 2];
}

void query(int st, int dr) {
	int len = dr - st + 1, e = E[len];
	fout << std::min(rmq[e][st], rmq[e][dr - (1 << e) + 1]) << '\n';
}

void solve_queries() {
	int x, y;
	for (int i = 1; i <= m; ++i) {
		fin >> x >> y;
		query(x, y);
	}
}

int main() {
	init();
	solve_queries();
}