Cod sursa(job #1816536)

Utilizator xSliveSergiu xSlive Data 26 noiembrie 2016 16:41:07
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
#define NMAX 1000010
#define f cin
#define g cout
using namespace std;

int maxim[NMAX];

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)]);
}

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

	int mid = (leftI + rightI) / 2;
	if(mid<a)	return getMax(rightSon(nod), mid + 1, rightI, a, b);
	else if (mid >= b) return getMax(leftSon(nod), leftI, mid, a, b);
	else return max(
		getMax(rightSon(nod), mid + 1, rightI, a, b),
		getMax(leftSon(nod), leftI, mid, 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) {
			
			cout << getMax(1, 1, n, a, b) << "\n";
			
		}
		else {
			update(1, 1, n, a, b);
		}
	}
	return 0;
}