Cod sursa(job #216959)

Utilizator plastikDan George Filimon plastik Data 26 octombrie 2008 13:33:54
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#define NMAX 100005

int A[NMAX], IT[2 * NMAX];
int m, n;

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

int buildIT(int i, int l, int r) {
	if (l > r)
		return 0;

	if (l == r) {
		IT[i] = A[l - 1];
		return A[l - 1];
	}

	int m = (l + r) / 2;
	return IT[i] = max(buildIT(2 * i, l, m), buildIT(2 * i + 1, m + 1, r));
}


int queryIT(int i, int l, int r, int s, int d) {
	if (s == l && d == r)
		return IT[i];

	int m = (l + r) / 2, vl = 0, vr = 0;
	if (l <= s && s <= m)
		vl = queryIT(2 * i, l, m, s, min(m , d));
	if (m < d && d <= r)
		vr = queryIT(2 * i + 1, m + 1, r, max(m + 1, s), d);

	return max(vl, vr);
}

int modifyIT(int i, int l, int r, int pos, int key) {
	if (l == pos && r == pos) {
		IT[i] = key;
		return key;
	}

	int m = (l + r) / 2, vl = IT[2 * i], vr = IT[2 * i + 1];
	if (l <= pos && pos <= m)
		vl = modifyIT(2 * i, l, m, pos, key);
	else
		vr = modifyIT(2 * i + 1, m + 1, r, pos, key);

	IT[i] = max(vl, vr);
	return IT[i];
}

int main() {

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

	scanf("%d %d", &n, &m);
	int i;
	for (i = 0; i < n; ++ i)
		scanf("%d", &A[i]);
	buildIT(1, 1, n);

	int opt, x, y;
	for (i = 0; i < m; ++ i) {
		scanf("%d %d %d", &opt, &x, &y);
		if (opt == 1)
			modifyIT(1, 1, n, x, y);
		else
			printf("%d\n", queryIT(1, 1, n, x, y));
	}

	return 0;
}