Cod sursa(job #195589)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 19 iunie 2008 21:21:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <math.h>

long n, num, i, a[1000000], m, a1, b1, max, choice, poz;

void make(long v1, long v2, long poz) {
	if (i >= v1 && i <= v2) {
		if (a[poz] < num) {
			a[poz] = num;
		}
		if (v1 == v2)
			return;
		make(v1, (v1 + v2) / 2, poz * 2);
		make((v1 + v2) / 2 + 1, v2, poz * 2 + 1);
	}
	return;
}

void query(long v1, long v2, long poz) {
	if (a1 <= v1 && b1 >= v2) {
		if (max < a[poz]) {
			max = a[poz];
		}
		if (v1 == v2) {
			return;
		}
	} else {
		if (a1 > v2 || b1 < v1) {
			return;
		} else {
			query(v1, (v1 + v2) / 2, poz * 2);
			query((v1 + v2) / 2 + 1, v2, poz * 2 + 1);
		}
	}
	return;
}

long maxim(long val1, long val2) {
	if (val1 < val2) {
		return val2;
	}
	return val1;
}


void update(long v1, long v2, long poz) {
	if (a1 >= v1 && a1 <= v2) {
		if (v1 == v2) {
			a[poz] = b1;
			return;
		}
		update(v1, (v1 + v2) / 2, poz * 2);
		update((v1 + v2) / 2 + 1, v2, poz * 2 + 1);
		a[poz] = maxim(a[poz * 2], a[poz * 2 + 1]);
	} else {
		return;
	}
}

int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%ld %ld", &n, &m);
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &num);
		make(1, n, 1);
	}
	for (i = 1; i <= m; ++i) {
		scanf("%ld %ld %ld", &choice, &a1, &b1);
		if (choice == 0) {
			max = 0;
			query(1, n, 1);
			printf("%ld\n", max);
		} else {
			update(1, n, 1);
		}
	}
	return 0;
}