Cod sursa(job #149918)

Utilizator wefgefAndrei Grigorean wefgef Data 6 martie 2008 12:03:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>

#define p1 ((poz) * 2)
#define p2 ((poz) * 2 + 1)
#define mij (((st) + (dr)) / 2)

int N, M;
int v[1 << 17];
int seg[1 << 18];

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

void build(int poz, int st, int dr) {
	if (st == dr) {
		seg[poz] = v[st];
		return;
	}
	build(p1, st, mij);
	build(p2, mij+1, dr);
	seg[poz] = max(seg[p1], seg[p2]);
}

int query(int poz, int st, int dr, int a, int b) {
	if (a <= st && dr <= b) return seg[poz];
	int best = 0;
	if (a <= mij) best = max(best, query(p1, st, mij, a, b));
	if (b > mij) best = max(best, query(p2, mij+1, dr, a, b));
	return best;
}

void update(int poz, int st, int dr, int a, int b) {
	if (st == dr) {
		seg[poz] = b;
		return;
	}
	if (a <= mij) update(p1, st, mij, a, b);
	else update(p2, mij+1, dr, a, b);
	seg[poz] = max(seg[p1], seg[p2]);
}

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

	scanf("%d %d", &N, &M);
	for (int i = 1; i <= N; ++i)
		scanf("%d", v+i);
	build(1, 1, N);

	for (int i = 0; i < M; ++i) {
		int op, a, b;
		scanf("%d %d %d", &op, &a, &b);
		if (op == 0) printf("%d\n", query(1, 1, N, a, b));
		else update(1, 1, N, a, b);
	}
}