Cod sursa(job #1816441)

Utilizator xSliveSergiu xSlive Data 26 noiembrie 2016 14:53:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#define NMAX 1000010
#define f cin
#define g cout
using namespace std;

int maxim[NMAX];
int Max;
inline int leftSon(int i) {
	return 2 * i;
}

inline int rightSon(int i) {
	return 2 * i + 1;
}

inline int max(int a, int b) {
	if (a > b)	return a;
	return b;
}

void update(int nod, int leftI, int rightI,int a,int b) {
	if (leftI == rightI) {
		maxim[nod] = b;
		return;
	}
	int mid = leftI + (rightI - leftI) / 2;
	if (a <= mid)	update(leftSon(nod), leftI, mid, a, b);
	else update(rightSon(nod), mid +1, rightI, a, b);
	maxim[nod] = max(maxim[leftSon(nod)], maxim[rightSon(nod)]);
}

void getMax(int nod, int leftI, int rightI, int a, int b) {
	if (a <= leftI && b >= rightI) {
		if (Max < maxim[nod])	Max = maxim[nod];
		return;
	}

	int mid = (leftI + rightI) / 2;
	if (a <= mid) getMax(leftSon(nod), leftI, mid, a, b);
	if (b > mid) getMax(rightSon(nod), mid + 1, rightI, a, b);		
}

int main() {
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int n, m;
	int el,a,b;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> el;
		update(1, 1, n, i, el);
	}
	for (int i = 1; i <= m; i++) {
		cin >> el >> a >> b;
		if (el == 0) {
			Max = -1;
			getMax(1, 1, n, a, b);
			cout << Max << "\n";
		}
		else {
			update(1, 1, n, a, b);
		}
	}
	return 0;
}