Cod sursa(job #144051)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 27 februarie 2008 09:42:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 1 << 17;
const int INF = 0x3f3f3f3f;

int V[NMAX], A[NMAX << 1];

void build(int i, int st, int dr) {
	if (st == dr) {
		A[i] = V[st];
		return;
	}

	int is, mij;
	is = i << 1; mij = (st + dr) >> 1;

	build(is, st, mij);
	build(is|1, mij+1, dr);
	A[i] = max(A[is], A[is|1]);
}

int query(int i, int st, int dr, int a, int b) {
	if (a <= st && dr <= b)
		return A[i];
	
	int is, mij, rez = 0;
	is = i << 1; mij = (st + dr) >> 1;

	if (a <= mij)
		rez = query(is, st, mij, a, b);
	if (mij < b)
		rez = max(rez, query(is|1, mij+1, dr, a, b) );
	
	return rez;
}

void update(int i, int st, int dr, int a, int b) {
	if (st == dr && st == a) {
		A[i] = b;
		return;
	}

	int is, mij;
	is = i << 1; mij = (st + dr) >> 1;

	if (a <= mij)
		update(is, st, mij, a, b);
	else
		update(is|1, mij+1, dr, a, b);

	A[i] = max(A[is], A[is|1]);
}

int main(void) {
	freopen("arbint.in", "rt", stdin);
	freopen("arbint.out", "wt", stdout);
	int N, M;
	int i, t, a, b;

	scanf(" %d %d", &N, &M);

	for (i = 1; i <= N; ++i)
		scanf(" %d", V + i);
	
	build(1, 1, N);

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

		if (t == 0)
			printf("%d\n", query(1, 1, N, a, b) );
		else
			update(1, 1, N, a, b);

	}

	return 0;
}