Cod sursa(job #2654549)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 1 octombrie 2020 15:54:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 100000;

int n, m;

int aint[4 * NMAX], v[NMAX + 1];

void build(int nod, int l, int r) {
	if (l == r) {
		aint[nod] = v[l];
		return;
	}
	int mj = (l + r) / 2;
	build(nod * 2, l, mj);
	build(nod * 2 + 1, mj + 1, r);
	aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

void update(int nod, int l, int r, int poz, int val) {

	if (l == r) {
		aint[nod] = val;
		return;
	}
	int mj = (l + r) / 2;
	if (poz > mj)
		update(nod * 2 + 1, mj + 1, r, poz, val);
	else
		update(nod * 2, l, mj, poz, val);
	aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

int query(int nod, int l, int r, int x, int y) {
	if (l >= x && r <= y) {
		return aint[nod];
	}
	int mj = (l + r) / 2;
	int s1 = 0, s2 = 0;
	if (x <= mj)
		s1 = query(nod * 2, l, mj, x, y);
	if (y > mj)
		s2 = query(nod * 2 + 1, mj + 1, r, x, y);
	return max(s1, s2);///max(aint[nod], max(s1, s2));

}

int main() {

	int x, y, type;

	fin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		fin >> v[i];
	}
	build(1, 1, n);
	for (int i = 1; i <= m; ++i) {
		fin >> type >> x >> y;
		if (type == 1) {
			update(1, 1, n, x, y);
		}
		else {
			fout << query(1, 1, n, x, y) << "\n";
		}

	}
}