Cod sursa(job #3287492)

Utilizator BuruianaRaresAndreiBuruiana Rares Andrei BuruianaRaresAndrei Data 18 martie 2025 13:22:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, q, a[100005], t[400005];

void build(int node, int l, int r) {
	if(l == r) {
		t[node] = a[l];
	}
	else {
		int mid = (l + r) / 2;
		build(node * 2, l, mid);
		build(node * 2 + 1, mid + 1, r);
		// t[node] = t[node * 2] + t[node * 2 + 1];
		t[node] = max(t[node * 2], t[node * 2 + 1]);
	}
}

void update(int node, int l, int r, int pos, int x) {
	if(l == r) {
		t[node] = x;
	}
	else {
		int mid = (l + r) / 2;
		if(mid >= pos) {
			update(node * 2, l, mid, pos, x);
		}
		else {
			update(node * 2 + 1, mid + 1, r, pos, x);
		}
		// t[node] = t[node * 2] + t[node * 2 + 1];
		t[node] = max(t[node * 2], t[node * 2 + 1]);
	}
}

int query(int node, int l, int r, int st, int dr) {
	if(st <= l && r <= dr) {
		return t[node];
	}
	else {
		int mid = (l + r) / 2, ans = 0;
		if(mid >= st) {
			ans = max(ans, query(node * 2, l, mid, st, dr));
		}
		if(mid + 1 <= dr) {
			ans = max(ans, query(node * 2 + 1, mid + 1, r, st, dr));
		}
		return ans;
	}
}

int main() {
	in >> n >> q;
	for(int i = 1; i <= n; i++) {
		in >> a[i];
	}
	build(1, 1, n);

	// for(int i = 1; i <= 9; i++) {
	// 	out << t[i] << '\n';
	// }

	while(q--) {
		int op, st, dr; in >> op >> st >> dr;
		if(op == 0) {
			out << query(1, 1, n, st, dr) << '\n';
		}
		else {
			update(1, 1, n, st, dr);
		}
		// for(int i = 1; i <= n; i++) {
		// 	out << query(1, 1, n, i, i) << ' ';
		// }
		// out << '\n';
	}
	return 0;
}