Cod sursa(job #713681)

Utilizator DSzprogDombi Szabolcs DSzprog Data 14 martie 2012 20:54:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <cstring>
#include <cstdio>
#include <cmath>

#define max(a, b) (a > b) ? a : b

int level(int n) {
	int level = 1;
	while (n > level) level <<= 1;
	return(level);
}

int n, m, l;
int heap[262144];

void change(int id, int val) {
	id = l + id;
	heap[id] = val;
	while (id /= 2) {
		heap[id] = max(heap[id * 2], heap[id * 2 + 1]);
	}
}

int maximum(int left, int right) {
	int maximum = 0;
	while (left < right) {
		if (left % 2 == 0 && right % 2 == 1) {
			if (maximum < heap[left]) maximum = heap[left];
			if (maximum < heap[right]) maximum = heap[right];
			left /= 2;
			right /= 2;
		} else {
			if (left % 2) {
				if (maximum < heap[left]) maximum = heap[left];
				++left;
			} else {
				if (maximum < heap[right]) maximum = heap[right];
				--right;
			}
		}
	}
	if (maximum < heap[left]) maximum = heap[left];
	return(maximum);
}

int main() {
	FILE * in = fopen("arbint.in", "rt");
	FILE * out = fopen("arbint.out", "wt");

	fscanf(in, "%d%d", &n, &m);
	l = level(n);
	for (int i = 0; i < n; ++i) {
		fscanf(in, "%d", &heap[l + i]);
	}
	for (int i = l - 1; i > 0; --i) {
		heap[i] = max(heap[i * 2], heap[i * 2 + 1]);
	}

	int a, b, c;
	for (int i = 0; i < m; ++i) {
		fscanf(in, "%d%d%d", &a, &b, &c);
		if (a) {
			change(b - 1, c);
		} else {
			printf("%d\n", maximum(l + b - 1, l + c - 1));
		}
	}

	fclose(in);
	fclose(out);
}