Cod sursa(job #2976490)

Utilizator the_horoHorodniceanu Andrei the_horo Data 9 februarie 2023 11:54:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <array>
#include <fstream>
#include <vector>

std::array<int, 400010> arb;

void update (int poz, int val, int left, int right, int node) {
	if (left == right && left == poz) {
		arb[node] = val;
		return;
	}

	int mid = (left + right) / 2;

	if (left <= poz && poz <= mid)
		update(poz, val, left, mid, node * 2);
	else if (mid < poz && poz <= right)
		update(poz, val, mid + 1, right, node * 2 + 1);

	arb[node] = std::max(arb[node * 2], arb[node * 2 + 1]);
}

int query (int poz_left, int poz_right, int left, int right, int node) {
	if (poz_left <= left && right <= poz_right)
		return arb[node];

	int mid = (left + right) / 2;

	int result = -1;

	if (poz_left <= mid)
		result = std::max(result, query(poz_left, poz_right, left, mid, node * 2));
	if (mid + 1 <= poz_right)
		result = std::max(result, query(poz_left, poz_right, mid + 1, right, node * 2 + 1));

	return result;
}

void build (int left, int right, int node, int v[]) {
	if (left == right) {
		arb[node] = v[left];
		return;
	}

	int mid = (left + right) / 2;

	build(left, mid, node * 2, v);
	build(mid + 1, right, node * 2 + 1, v);

	arb[node] = std::max(arb[node * 2], arb[node * 2 + 1]);
}

int main () {
	std::ifstream in("arbint.in");
	in.exceptions(std::ifstream::failbit);
	std::ofstream out("arbint.out");
	out.exceptions(std::ofstream::failbit);

	int n, m;
	int v[100001];
	
	in >> n >> m;
	for (int i = 1; i <= n; ++ i)
		in >> v[i];

	build(1, n, 1, v);

	for (int i = 1; i <= m; ++ i) {
		int tip, x, y;
		in >> tip >> x >> y;

		if (tip == 0) {
			out << query(x, y, 1, n, 1) << '\n';
		} else {
			update(x, y, 1, n, 1);
		}
	}
}