Cod sursa(job #1058447)

Utilizator kitzTimofte Bogdan kitz Data 15 decembrie 2013 15:58:45
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
#define max(a,b) (a > b) ? a : b
std::ifstream fin ("arbint.in");
std::ofstream fout ("arbint.out");

int A[400500], a, b;
inline void update(int nod, int st, int dr){
	if(st == dr){
		A[nod] = b;
		return;
	}
	int m = (st + dr) / 2;
	if(a <= m) {
		update(2*nod, st, m);
	}
	else{
		update(2*nod+1, m+1, dr);
	}
	A[nod] = max(A[2 * nod], A[2 * nod + 1]);
}
inline int query(int nod, int st, int dr){
	if(a <= st && b >= dr)
		return A[nod];
	int m = (st + dr) / 2;
	int max1 = -1, max2 = -1;
	if(a <= m) max1 = query(2*nod, st, m);
	if(b > m) max2 = query(2*nod + 1, m+1, dr);
	return max(max1, max2);
}
int main(){
	int n, m;
	fin >> n >> m;
	for(int i = 1; i <= n; i++){
		fin >> b; a = i; update(1, 1, n);
	}
	int op;
	while(m != 0){
		fin >> op >> a >> b;
		if(op == 1) update(1, 1, n);
		else fout << query(1, 1, n) << "\n";
		m --;
	}
	return 0;
}