Cod sursa(job #645215)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 8 decembrie 2011 20:43:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<cstdio>
#define max(a, b) (a > b ? a : b)
#define Check() if (++i == 80001) {fread (buff, 1, 80001, stdin); i = 0;}

using namespace std;
int n, m, valMax, i;
int arb[300100];
char buff[80001];

inline void Read(int &nr){
	nr = 0;
	while (buff[i] < '0' || buff[i] > '9') Check();
	while (buff[i] >= '0' && buff[i] <= '9'){
		nr = nr * 10 + (buff[i] - '0');
		Check();
	}
}

void Update(int i, int st, int dr, int a, int b) {
	if(st == dr) {arb[i] = b; return ; }
	
	int mij = (st + dr) / 2;
	if(a <= mij) Update(2 * i, st, mij, a, b);
	else Update(2 * i + 1, mij + 1, dr, a, b);
	
	arb[i] = max(arb[2 * i], arb[2 * i + 1]);
}

void Query(int i, int st, int dr, int a, int b) {
	if(a <= st && dr <= b) {
		valMax = max(valMax, arb[i]);
		return ;
	}
	int mij = (st + dr) / 2;
	if(a <= mij) Query(2 * i, st, mij, a, b);
	if(mij < b) Query(2 * i + 1, mij + 1, dr, a, b);
}

int main() {
	int i, tip, a, b;
	
	freopen("arbint.in", "r", stdin), freopen("arbint.out", "w", stdout);
	Read(n); Read(m);
	
	for(i = 1; i <= n; i++) {
		Read(a);
		Update(1, 1, n, i, a);
	}
	for(i = 1; i <= m; i++) {
		Read(tip); Read(a); Read(b);
		if(tip == 1) Update(1, 1, n, a, b);
		else {
			valMax = -1;
			Query(1, 1, n, a, b);
			printf("%d\n", valMax);
		}
	}
	
	return 0;
}