Cod sursa(job #210648)

Utilizator ilincaSorescu Ilinca ilinca Data 28 septembrie 2008 14:18:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>

#define MAXnm 100000
#define pr(x) fprintf(stderr, #x" = %d\n", x)

int n, m, p, v, f, l, max, arb [5*MAXnm];


int maxim (int a, int b)
{
	if (a > b)
		return a;
	return b;
}

void update (int nod, int x, int y)
{
	if (x == y)
	{
		arb [nod]=v;
		return;
	}
	int mij=(x+y)>>1;
	if (mij >= p)
		update (nod<<1, x, mij);
	else
		update ((nod<<1)|1, mij+1, y);
	arb [nod]=maxim (arb [nod<<1], arb [(nod<<1)|1]);
}

void query (int nod, int x, int y)
{
	if (f <= x && l >= y)
	{
		max=maxim (max, arb [nod]);
		return;
	}
	int mij=(x+y)>>1;
	if (f <= mij) 
		query (nod<<1, x, mij);
	if (l > mij)
		query ((nod<<1)|1, mij+1, l);
}

int main ()
{
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
        int i, x;
	scanf ("%d%d", &n, &m);
	for (i=1; i<=n; ++i)
	{
		scanf ("%d", &v);
		p=i;
		update (1, 1, n);
	}
        for (i=1; i<=4*n; ++i)	
		pr(arb [i]);
	for (i=1; i<=m; ++i)
	{
		scanf ("%d%d%d", &x, &f, &l);
		if (x)
		{
			p=f;
			v=l;
			update (1, 1, n);
		}	
		else
		{
			max=-1;
			query (1, 1, n);
			printf ("%d\n", max);
		}
	}
	return 0;
}