Cod sursa(job #431054)

Utilizator slayer4uVictor Popescu slayer4u Data 31 martie 2010 17:04:19
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <cstdio>
using namespace std;

#define NMAX 100050
#define inf 214700000
#define max(a, b) (a) > (b) ? (a) : (b)

long n, m, code, a, b, indexes[NMAX], x[NMAX], aint[NMAX * 2 + 1];

void build(long left, long right, long index)
{
	if (left == right)
		indexes[left] = index;
	else
	{
		long middle = left + (right - left) / 2;
		build(left, middle, 2 * index);
		build(middle + 1, right, 2 * index + 1);
	}
}

void update(long index, long value)
{
	aint[index] = value;
	index /= 2;
	while (index)
	{
		aint[index] = aint[2 * index] > aint[2 * index + 1] ? aint[2 * index] : aint[2 * index + 1];
		index /= 2;
	}
}

long query(long a, long b, long left, long right, long index)
{
	if (a <= left && right <= b)
		return aint[index];
	long middle = left + (right - left) / 2, rez = -inf;

	if (a <= middle)
		rez = max(rez, query(a, b, left, middle, 2 * index));
	
	if (b > middle)
		rez = max(rez, query(a, b, middle + 1, right, 2 * index + 1));
	return rez;
}

int main()
{
	freopen ("arbint.in", "rt", stdin);
	freopen ("arbint.out", "wt", stdout);

	scanf("%ld %ld", &n, &m);

	build(1, n, 1);

	for (long i = 1; i <= n; ++i)
		scanf("%ld", &x[i]), update(indexes[i], x[i]);

	for (long i = 1; i <= m; ++i)
	{
		scanf("%ld %ld %ld", &code, &a, &b);
		if (!code)
			printf("%ld\n", query(a, b, 1, n, 1));
		else
			update(indexes[a], b);
	}


	return 0;
}