Cod sursa(job #145485)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 28 februarie 2008 21:00:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>

#define MAXN 100005
#define MAXT 262144

int N, M, x[MAXN];

int aint[MAXT];

#define aintCommon m = (l + r) >> 1, lc = (n << 1), rc = lc + 1

inline int max( int a, int b )
{
	return (a > b) ? a : b;
}

inline void buildTree( int n, int l, int r )
{
	if (l == r)
	{
		aint[n] = x[l];
		return;
	}

	int aintCommon;
	buildTree( lc, l, m );
	buildTree( rc, m + 1, r );
	aint[n] = max( aint[lc], aint[rc] );
}

inline int query( int n, int l, int r, int Ql, int Qr )
{
	if (Ql <= l && r <= Qr)
		return aint[n];

	int aintCommon;
	int rez = -0x3f3f3f3f;
	if (Ql <= m)
		rez = max( rez, query( lc, l, m, Ql, Qr ) );
	if (Qr > m)
		rez = max( rez, query( rc, m + 1, r, Ql, Qr ) );
	return rez;
}

inline void update( int n, int l, int r, int poz )
{
	if (l == r)
	{
		aint[n] = x[l];
		return;
	}

	int aintCommon;
	if (poz <= m)
		update( lc, l, m, poz );
	else
		update( rc, m + 1, r, poz );
	aint[n] = max( aint[lc], aint[rc] );
}

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

	scanf("%d %d", &N, &M);
	for (int i = 1; i <= N; i++)
		scanf("%d", x + i);

	buildTree( 1, 1, N );

	for (; M; M--)
	{
		int type, a, b;
		scanf("%d %d %d", &type, &a, &b);

		if (type == 0)
			printf("%d\n", query( 1, 1, N, a, b ));
		else
		{
			x[a] = b;
			update( 1, 1, N, a );
		}
	}

	return 0;
}