Cod sursa(job #2410025)

Utilizator LucaSeriSeritan Luca LucaSeri Data 19 aprilie 2019 17:27:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5 + 10;

int aint[MAXN<<2];

void update(int node, int st, int dr, int poz, int val) {
	if(st == dr) {
		aint[node] = val;
		return;
	}

	int mid = st + dr >> 1;
	if(poz <= mid) update(node<<1, st, mid, poz, val);
	else update(node<<1|1, mid + 1, dr, poz, val);

	aint[node] = max(aint[node<<1], aint[node<<1|1]);
}

int query(int node, int st, int dr, int a, int b) {
	if(st >= a && dr <= b) return aint[node];

	int mid = st + dr >> 1;
	int ret = 0;
	if(a <= mid) ret = query(node<<1, st, mid, a, b);
	if(b > mid) ret = max(ret, query(node<<1|1, mid + 1, dr , a, b));

	return ret;
}


int main() {
	#ifdef BLAT
		freopen("input", "r", stdin);
	#else
		freopen("arbint.in", "r", stdin);
		freopen("arbint.out", "w", stdout);
	#endif

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int n;
	cin >> n;
	int m;
	cin >> m;

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

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