Cod sursa(job #2757187)

Utilizator lucamLuca Mazilescu lucam Data 4 iunie 2021 12:21:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <limits>

std::ifstream in("arbint.in");
std::ofstream out("arbint.out");

const int N = 1 << 18;
int n, v[N + 1];

int g_val, g_poz;

void update_impl(int p = 1, int l = 1, int r = n) {
	if (l == r) {
		v[p] = g_val;
		return;
	}
	int m = (l + r) / 2;
	if (g_poz <= m) {
		update_impl(2 * p, l, m);
	} else {
		update_impl(2 * p + 1, m + 1, r);
	}
	v[p] = std::max(v[2 * p], v[2 * p + 1]);
}

inline void update(int poz, int val) {
	g_val = val, g_poz = poz;
	update_impl();
}

int g_l, g_r;

int query_impl(int p = 1, int l = 1, int r = n) {
	if (g_l <= l && g_r >= r) {
		return v[p];
	}
	int m = (l + r) / 2;
	int lres = std::numeric_limits<int>::min();
	int rres = std::numeric_limits<int>::min();
	if (g_l <= m) {
		lres = query_impl(2 * p, l, m);
	}
	if (m < g_r) {
		rres = query_impl(2 * p + 1, m + 1, r);
	}
	return std::max(lres, rres);
}

inline int query(int l, int r) {
	g_l = l, g_r = r;
	return query_impl();
}

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

	for (int i = 0; i < q; ++i) {
		int type;
		in >> type;
		if (type == 0) {
			int a, b;
			in >> a >> b;
			out << query(a, b) << '\n';
		} else {
			int p, x;
			in >> p >> x;
			update(p, x);
		}
	}
}