Cod sursa(job #1443888)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 28 mai 2015 21:43:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#define _submit
#ifdef _submit
#define InFile "arbint.in"
#define OutFile "arbint.out"
#else
#define InFile "fis.in"
#define OutFile "fis.out"
#endif

#define MAXARBSZ 300000

int arbInt[MAXARBSZ];
int arbSz;

int gudSz(int n) {
	int p = 1;
	while (p < n)
		p <<= 1;
	return p;
}

int max3(int a, int b, int c) {
	return std::max(a, std::max(b, c));
}

void update(int pos, int x) {
	pos += arbSz - 1;
	arbInt[pos] = x;
	pos >>= 1;
	while (pos) {
		int aux = std::max(arbInt[pos << 1], arbInt[(pos << 1) + 1]);
		if (arbInt[pos] <= aux)
			break;
		arbInt[pos] = aux;
		pos >>= 1;
	}
}

int query(int left, int right) {
	left += arbSz - 1;
	right += arbSz - 1;
	int result = -1;
	while (left <= right) {
		result = max3(arbInt[left], arbInt[right], result);
		left = (left + 1) >> 1;
		right = (right - 1) >> 1;
	}
	return result;
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OutFile, "w", stdout));
	int N, M;
	scanf("%d%d", &N, &M);
	arbSz = gudSz(N);
	for (int i = arbSz; i < arbSz + N; i++)
		scanf("%d", &arbInt[i]);
	for (int i = arbSz + N; i< (arbSz << 1); i++)
		arbInt[i] = -1;
	for (int i = arbSz - 1; i > 0; i--)
		arbInt[i] = std::max(arbInt[i << 1], arbInt[(i << 1) + 1]);
	for (int i = 0; i < M; i++) {
		int o, a, b;
		scanf("%d%d%d", &o, &a, &b);
		if (o == 0)
			printf("%d\n", query(a, b));
		else
			update(a, b);
	}
	return 0;
}