Cod sursa(job #531408)

Utilizator Gaby_mMititelu Gabriel Gaby_m Data 9 februarie 2011 17:12:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>

using namespace std;
#define NMAX 100001

int N;
int arb[5*NMAX];
int val, pos;
int left, right;

int max(int a, int b) {
	return a > b? a: b;
}

void update(int nod, int st, int dr) {
	if (st == dr) { 
		arb[nod] = val; 
		return;
	}
	int mij = (st + dr) / 2;
	if (pos <= mij) update(nod * 2, st, mij);
	else update(nod * 2 + 1, mij + 1, dr);

	arb[nod] = max (arb[2*nod], arb[2*nod+1]);
}

int arb_max(int nod, int st, int dr) {
	if (left <= st && dr <= right) return arb[nod];

	int mij = (st + dr) / 2;
	int maxleft, maxright;
	maxleft = maxright = 0;
	if (left <= mij) maxleft = arb_max(nod * 2, st, mij);
	if (mij < right) maxright = arb_max(nod * 2 + 1, mij + 1, dr);

	return max(maxleft, maxright);
}

int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int M;

	scanf("%d %d", &N, &M);
	for (int i = 1; i <= N; i++) {
		scanf("%d", &val);
		pos = i;
		update(1, 1, N);
	}

	int op, a, b;
	for (int i = 0; i < M; i++) {
		scanf("%d %d %d", &op, &a, &b);

		if (!op) {
			left = a;
			right = b;
			printf("%d\n", arb_max(1,1,N));
		}
		else {
			val = b;
			pos = a;
			update(1, 1, N);
		}
	}
	return 0;
}