Cod sursa(job #2879561)

Utilizator mihai_sabouSabou Mihai mihai_sabou Data 28 martie 2022 19:02:50
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <iostream>
#include <fstream>

using namespace std;

const int nmax = 1e5 + 1;

int n, rmq[nmax + 1][18], logaritm[nmax + 1];

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

	int n, q;
	in >> n >> q;

	for (int i = 1; i <= n; ++i) {
		in >> rmq[i][0];
	}

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

	for (int j = 1; (1 << j) <= n; ++j) {
		for (int i = 1; i <= n + 1 - (1 << j); ++i) {
			rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
		}
	}

	for (int i = 1; i <= q; ++i) {
		int st, dr;
		in >> st >> dr;

		int lungime = dr - st + 1;
		int j = logaritm[lungime];

		out << min(rmq[st][j], rmq[dr + 1 - (1 << j)][j]) << '\n';
	}

	return 0;
}