Cod sursa(job #1074531)

Utilizator danny794Dan Danaila danny794 Data 7 ianuarie 2014 18:46:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <cmath>

#define maximum(a, b) a > b ? a : b

using namespace std;
const int MAXN = 1 << 18;
int N, M, K;
int MaxValues[MAXN];

inline void insert(int pos, int val) {
	int p = (1 << K) + pos;
	MaxValues[p] = val;
	while( p > 1 ) {
		p >>= 1;
		MaxValues[p] = maximum(MaxValues[2 * p], MaxValues[2 * p + 1]);
	}
}

inline int getMax(int L, int R, int left, int right, int pos) {
	if (L == left && R == right)
		return MaxValues[pos];

	int m = (L + R) >> 1;

	if ( right <= m )
		return getMax(L, m, left, right, 2 * pos);

	if ( left > m )
		return getMax(m + 1, R, left, right, 2 * pos + 1);

	int lM, rM, result;
	lM = getMax(L, m, left, m, 2 * pos);
	rM = getMax(m + 1, R, m + 1, right, 2 * pos + 1);
	result = maximum(lM, rM);

	return result;
}

inline void read() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%i %i", &N, &M);
	K = (int) (log(N) / log(2));
	if (1 << K < N)
		K++;
	int x;
	for( int i = 0; i < N; i++) {
		scanf("%i", &x);
		insert(i, x);
	}
}

void solve() {
	int type, a, b;
	for(int i = 0; i < M; i++) {
		scanf("%i%i%i", &type, &a, &b);
		switch(type){
			case(0): printf("%i\n", getMax(1, 1 << K, a, b, 1)); break;
			case(1): insert(a - 1, b); break;
		}
	}
}

int main() {
	read();
	solve();
	return 0;
}