Cod sursa(job #2812987)

Utilizator Langa_bLanga Radu Langa_b Data 5 decembrie 2021 16:27:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m, arbint[400000], cit[100002], pos, start, fin, act, ans;
void update(int nod, int st, int dr) {
	if (st == dr) {
		arbint[nod] = act;
		return;
	}
	int div = (st + dr) / 2;
	if (pos <= div) {
		update(nod * 2, st, div);
	}
	else {
		update(nod * 2 + 1, div + 1, dr);
	}
	arbint[nod] = max(arbint[nod * 2], arbint[nod * 2 + 1]);
}
void query(int nod, int st, int dr){
	if (st >= start && dr <= fin) {
		if (ans < arbint[nod]) {
			ans = arbint[nod];
			return;
		}
	}
	else {
		int div = (st + dr) / 2;
		if (div >= start) {
			query(nod * 2, st, div);
		}
		if (div + 1 <= fin) {
			query(nod * 2 + 1, div + 1, dr);
		}
	}
}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> cit[i];
		pos = i;
		act = cit[i];
		update(1, 1, n);
	}
	for (int i = 1; i <= m; i++) {
		int c, x, y;
		cin >> c >> x >> y;
		if (c == 1) {
			pos = x;
			act = y;
			update(1, 1, n);
		}
		else {
			ans = -1;
			start = x;
			fin = y;
			query(1, 1, n);
			cout << ans << '\n';
		}
	}
}