Cod sursa(job #3350117)

Utilizator minusllIvanus Mihai minusll Data 5 aprilie 2026 15:42:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

string name = "arbint";

ifstream in(name + ".in");
ofstream out(name + ".out");

vector<int> ST;
int A[100001];
int n, m;
void build(int node, int L, int R) {
	if (L == R) {
		ST[node] = A[L];
	}
	else {
		int mid = (L + R) / 2;
		build(node * 2, L, mid);
		build(node * 2 + 1, mid + 1, R);
		ST[node] = max(ST[node * 2], ST[node * 2 + 1]);
	}
}

void update(int node, int L, int R, int id, int val) {
	if (L == R) {
		A[L] = val;
		ST[node] = val;
	}
	else {
		int mid = (R + L) / 2;
		if (id <= mid) {
			update(node * 2, L, mid, id, val);
		}
		else {
			update(node * 2 + 1, mid + 1, R, id, val);
		}
		ST[node] = max(ST[node * 2], ST[node * 2 + 1]);
	}
}

int query(int node, int tl, int tr, int L, int R) {
	if (R < tl || L > tr) return INT_MIN;
	if (L <= tl && tr <= R) return ST[node];
	int tm = (tr + tl) / 2;

	return max(query(node * 2, tl, tm, L, R), query(node * 2 + 1, tm + 1, tr, L, R));
}

int main() {
	in >> n >> m;

	for (int i = 1; i <= n; i++) in >> A[i];
	
	ST.resize(4 * n);
	build(1, 1, n);

	int c, a, b;
	while (m--) {
		in >> c >> a >> b;
		if (c == 0) {
			out << query(1, 1, n, a, b) << '\n';
		}
		else {
			update(1, 1, n, a, b);
		}
	}
}