Cod sursa(job #3327996)

Utilizator AndreiRaresAcatrini Rares Andrei AndreiRares Data 5 decembrie 2025 20:14:07
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <algorithm>
#include <string>       
#include <unordered_map>    
#include <set>    
#include <utility>    
#include <vector>
using namespace std;

int a[100001], aint[400005];

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

void update(int node, int l, int r, int pos, int val) {
	if (l == r) {
		aint[node] = val;
		return;
	}
	int mid = (l + r) / 2;
	if (pos <= mid) update(node * 2, l, mid, pos, val);
	else update(node * 2 + 1, mid + 1, r, pos, val);
	aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}

int query(int node, int l, int r, int ql, int qr) {
	if (qr < l || r < ql) return 0;
	if (ql <= l && r <= qr) return aint[node];
	int mid = (l + r) / 2;
	return max(query(node * 2, l, mid, ql, qr), query(node * 2 + 1, mid + 1, r, ql, qr));
}

int main() {
	int n, q, t, x, y;
	cin >> n >> q;
	for (int i=1; i<=n; i++) cin >> a[i];
	build(1, 1, n);
	for (int i=1; i<=q; i++) {
		cin >> t >> x >> y;
		if (t == 0) cout << query(1, 1, n, x, y) << '\n';
		else update(1, 1, n, x, y);
	}
}