Cod sursa(job #146600)

Utilizator andrei_infoMirestean Andrei andrei_info Data 1 martie 2008 22:14:06
Problema Arbori de intervale Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>

#define MAX 100005

int arb[2*MAX], N, M;

inline int max ( int a, int b)
{
	if ( a > b ) return a; else return b;
}

void update( int nod, int st, int dr, int poz, int v)
{
	if ( st == dr && dr==poz)
		arb[nod] = v;
	else
	{
		int mij = (st + dr) >> 1;
		if (poz <= mij )
			update(2*nod, st, mij, poz, v);
		else
			update(2*nod+1, mij+1, dr, poz, v);

		arb[nod] = max ( arb[2*nod], arb[2*nod+1]);

	}
}

int query( int nod, int st, int dr, int a, int b)
{
	if ( a<= st && b >= dr )
		return arb[nod];
	else
	{
		int mij = (st+dr) >> 1;
		int r1 =-1, r2= -1;
		if (a <= mij) r1=query(2*nod, st, mij, a, b);
		if (b > mij ) r2=query(2*nod+1, mij+1, dr, a, b);
		return max( r1, r2);
	}
}


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

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

	int aux;

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

	for ( ; M>0; M--)
	{
		int a,b,c;
		scanf("%d %d %d", &a, &b, &c);
		if ( a == 0 )
			printf("%d\n", query(1, 1, N, b, c) );
		else
			update(1,1,N, b,c);
	}

        return 0;
}