Cod sursa(job #151772)

Utilizator MarquiseMarquise Marquise Data 8 martie 2008 16:41:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>

#define RMAX 500000

int n, m, r[RMAX], max;

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

void update(int n, int st, int dr, int poz, int val)
{
	int m;
	if ( st == dr)
		r[n] = val;
	else
	{
		m = ( st + dr ) / 2;
		if ( poz <= m)
			update( 2 * n, st, m, poz, val);
		else
			update( 2 * n + 1, m + 1, dr, poz, val);

		r[n] = MAX( r[2 * n], r[2 * n +1] );
	}
}


void query(int n, int st, int dr, int a, int b)
{
	int m;

	if ( a <= st && dr <= b)
		max = MAX(max, r[n]);
	else
	{
		m = ( st + dr) / 2;
		if ( a <= m)
			query( 2 * n, st, m, a, b);
		if ( b > m)
			query( 2 * n + 1, m + 1, dr, a, b);
	}

}


int main()
{
	int i, a, b, p, x;
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for ( i = 1; i <= n; i++)
	{
		scanf("%d", &x);
		update(1, 1, n, i, x);
	}
	for ( i = 1; i <= m; i++)
	{
		scanf("%d %d %d", &p, &a, &b);
		if ( p == 0)
		{
			max = 0;
			query(1, 1, n, a, b);
			printf("%d\n", max);
		}
		else
			update(1, 1, n, a, b);


	}
	return 0;
}