Cod sursa(job #2750024)

Utilizator cristivasileVasile George-Cristian cristivasile Data 9 mai 2021 15:34:45
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m, x, opt, pos, p, u, mini;
int arb[500001];

//acelasi program ca la arbint doar ca nu exista operatii de update iar arborele de intervale retine minime, nu maxime

void update(int nod, int p, int u, int pos, int val) {
	int mij;
	if (p == u) {
		arb[nod] = val;
	}
	else {

		mij = (p + u) / 2;

		if (pos <= mij)
			update(2 * nod, p, mij, pos, val);
		else update(2 * nod + 1, mij + 1, u, pos, val);

		if (arb[2 * nod] < arb[2 * nod + 1])
			arb[nod] = arb[2 * nod];
		else arb[nod] = arb[2 * nod + 1];
	}
}

void query(int nod, int p, int u, int ip, int iu) {
	int mij;
	if (ip <= p && u <= iu) {
		if (arb[nod] < mini)
			mini = arb[nod];
	}
	else {
		mij = (p + u) / 2;
		if (ip <= mij)
			query(2 * nod, p, mij, ip, iu);
		if (mij < iu)
			query(2 * nod + 1, mij + 1, u, ip, iu);
	}

}

int main()
{
	f >> n >> m;

	for (int i = 1; i <= n; i++) {
		f >> x;
		update(1, 1, n, i, x);
	}

	for (int i = 0; i < m; i++) {
			f >> p >> u;
			mini = 99999999;
			query(1, 1, n, p, u);
			g << mini << "\n";
	}

	return 0;
}