Cod sursa(job #3204729)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 17 februarie 2024 12:41:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>

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

const int MAX = 1e5 + 5;

int n, m;
int v[MAX], aint[4 * MAX];

void createAINT(int nod, int st, int dr) {
	if (st == dr) {
		aint[nod] = v[st];
	}
	else {
		int m = (st + dr) / 2;

		createAINT(2 * nod, st, m); //2 * nod = vecin din st
		createAINT(2 * nod + 1, m + 1, dr); //2 * nod + 1 = vecin din dr

		aint[nod] = std::max(aint[2 * nod], aint[2 * nod + 1]);
	}
}

void update(int nod, int st, int dr, int poz, int x) {
	if (st == dr) {
		aint[nod] = x;
	}
	else {
		int m = (st + dr) / 2;
		if (m < poz)
			update(2 * nod + 1, m + 1, dr, poz, x);
		else
			update(2 * nod, st, m, poz, x);

		aint[nod] = std::max(aint[2 * nod], aint[2 * nod + 1]);
	}
}

int solve_query(int nod, int st, int dr, int a, int b) {
	if (a <= st and dr <= b) {
		return aint[nod];
	}
	else {
		int m = (st + dr) / 2;
		if (b <= m)
			return solve_query(2 * nod, st, m, a, b);
		if (m + 1 <= a)
			return solve_query(2 * nod + 1, m + 1, dr, a, b);

		return std::max(solve_query(2 * nod, st, m, a, b), solve_query(2 * nod + 1, m + 1, dr, a, b));
	}
}

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

	for (int i = 1; i <= n; ++i)
		fin >> v[i];

	createAINT(1, 1, n);

	int q, a, b;

	while (m--) {
		fin >> q >> a >> b;
		if (q == 1)
			update(1, 1, n, a, b);
		else
			fout << solve_query(1, 1, n, a, b) << '\n';
	}
}