Cod sursa(job #2812776)

Utilizator lucamLuca Mazilescu lucam Data 5 decembrie 2021 02:39:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

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

const int N = 1 << 18;

int n;
struct SegTree {
	int v[N];
	void update(int i, int x, int node = 1, int l = 1, int r = n) {
		if (l == r) {
			v[node] = x;
			return;
		}
		int m = (l + r) / 2;
		if (i <= m) {
			update(i, x, 2 * node, l, m);
		} else {
			update(i, x, 2 * node + 1, m + 1, r);
		}
		v[node] = std::max(v[2 * node], v[2 * node + 1]);
	}
	int query(int ql, int qr, int node = 1, int l = 1, int r = n) {
		if (ql <= l && r <= qr) {
			return v[node];
		}
		int lres, rres;
		lres = rres = std::numeric_limits<int>::min();
		int m = (l + r) / 2;
		if (ql <= m) {
			lres = query(ql, qr, 2 * node, l, m);
		}
		if (qr > m) {
			rres = query(ql, qr, 2 * node + 1, m + 1, r);
		}
		return std::max(lres, rres);
	}
} tree;

enum Query {
	Query,
	Update
};

int main() {
	int q;
	in >> n >> q;
	for (int i = 1; i <= n; ++i) {
		int x;
		in >> x;
		tree.update(i, x);
	}
	while (q--) {
		int query;
		int a, b;
		in >> query >> a >> b;
		switch (query) {
		case Query:
			out << tree.query(a, b) << '\n';
			break;
		case Update:
			tree.update(a, b);
			break;
		}
	}
}