Cod sursa(job #2222867)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 18 iulie 2018 13:02:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

const int MAXN = 1e5;
const int MAXM = 1e5;

int n, m, mx[MAXN << 2];

void update(int nod, int st, int dr, int poz, int val) {
	if (st == dr)	mx[nod] = val;
	else {
		int mij = (st + dr) >> 1;
		if (mij >= poz) update(nod << 1, st, mij, poz, val);
		else update(nod << 1 ^ 1, mij + 1, dr, poz, val);
		mx[nod] = max(mx[nod << 1], mx[nod << 1 ^ 1]);
	}
}

int query(int nod, int st, int dr, int a, int b) {
	if (a <= st && dr <= b) return mx[nod];
	int mij = (st + dr) >> 1;
	int left = 0, right = 0;
	if (mij >= a) left = query(nod << 1, st, mij, a, b);
	if (mij < b) right = query(nod << 1 ^ 1, mij + 1, dr, a, b);
	return max(left, right);
}

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

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

	int t, a, b;
	for (int i = 1; i <= m; ++ i) {
		in >> t >> a >> b;
		if (t) update(1, 1, n, a, b);
		else out << query(1, 1, n, a, b) << '\n';
	}

	return 0;
}