Cod sursa(job #272461)

Utilizator danielpDaniel Pasaila danielp Data 7 martie 2009 08:42:36
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>

#define MAXN 300011
#define left(x) ((x) << 1)
#define right(x) (((x) << 1) + 1)

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

int N, A[MAXN], elem, value, li, ls;

void update(int li, int ls, int ind)
{
	if (li > ls)
		return;
	if (ls < elem || li > elem)
		return;
	if (li == ls)
	{
		A[ind] = value;
		return;
	}
	int mij = (li + ls) / 2;

	update(li, mij, left(ind));
	update(mij + 1, ls, right(ind));

	A[ind] = MAX(A[left(ind)], A[right(ind)]);
}

int query(int b, int e, int ind)
{
	if (b > e)
		return 0;
	if (b > ls || e < li)
		return 0;
	if (b >= li && e <= ls)
		return A[ind];
	
	int mij = (b + e) / 2;
	int leftValue = query(b, mij, left(ind));
	int rightValue = query(mij + 1, e, right(ind));

	return MAX(leftValue, rightValue);
}

void readDataAndSolve()
{
	int M;

	scanf("%d %d", &N, &M);

	for (int i = 0; i < N; i++)
	{
		elem = i;
		scanf("%d", &value);
		update(0, N - 1, 1);
	}

	for (int i = 0; i < M; i++)
	{
		int tip, a, b;

		scanf("%d %d %d", &tip, &a, &b);

		if (tip == 0)
		{
			a--, b--;
			li = a, ls = b;
			printf("%d\n", query(0, N - 1, 1));
		}
		else
		{
			a--;
			elem = a;
			value = b;
			update(0, N - 1, 1);
		}
	}
}

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

	readDataAndSolve();

	return 0;
}