Cod sursa(job #2079687)

Utilizator ice_creamIce Cream ice_cream Data 1 decembrie 2017 18:31:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int arbore[4 * NMAX + 1];

void actualizeaza(int pozitie, int valoare, int nod, int a, int b) {
	if (a == b) {
		arbore[nod] = valoare;
		return;
	}

	int m = (a + b) / 2;
	if (pozitie <= m) 
		actualizeaza(pozitie, valoare, 2 * nod, a, m);
	else 
		actualizeaza(pozitie, valoare, 2 * nod + 1, m + 1, b);

	arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);
}

int afla(int l, int r, int nod, int a, int b) {
	if (l <= a && b <= r) return arbore[nod];

	int m = (a + b) / 2;
	int rez1 = -1;
	int rez2 = -1;
	if (l <= m) rez1 = afla(l, r, 2 * nod, a, m);
	if (r > m) rez2 = afla(l, r, 2 * nod + 1, m + 1, b);

	return max(rez1, rez2);
}

int main() {
	int n, m, op, a, b;
	f >> n >> m;

	for (int i = 1; i <= n; i++) {
		f >> a;
		actualizeaza(i, a, 1, 1, n);
	}

	for (int i = 1; i <= m; i++) {
		f >> op >> a >> b;
		if (op == 1)
			actualizeaza(a, b, 1, 1, n);
		else
			g << afla(a, b, 1, 1, n) << '\n';
	}

	return 0;
}