Cod sursa(job #2570617)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 4 martie 2020 18:04:06
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

int aint[MAXN << 2];

int query(int nod, int st, int dr, int a, int b) {
	if (a <= st && dr <= b) return aint[nod]; 
	int mid = (st + dr) / 2;
	int le = 0, ri = 0;
	if (mid >= a) le = query(nod << 1, st, mid, a, b);
	if (mid < b) ri = query((nod << 1) + 1, mid + 1, dr, a, b);
	return max(le, ri);
}

void update(int nod, int st, int dr, int a, int b) {
	if (st == dr) {
		aint[nod] = b;
	}
	else {
		int mid = (st + dr) / 2;
		if (mid >= a) update(nod << 1, st, mid, a, b);
		else update((nod << 1) + 1, mid + 1, dr, a, b);
		aint[nod] = max(aint[nod << 1], aint[(nod << 1) + 1]);
	}
}

int m, n;

int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	cin >> n >> m;
	int nr;
	for (int i = 1; i <= n; ++ i) {
		cin >> nr;
		update(1, 1, n, i, nr);
	}

	int q, a, b;
	while (m --) {
		cin >> q >> a >> b;
		if (q) update(1, 1, n, a, b);
		else cout << query(1, 1, n, a, b) << '\n';
	}

	return 0;
}