Cod sursa(job #353828)

Utilizator ilincaSorescu Ilinca ilinca Data 6 octombrie 2009 13:28:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>

#define nmax 100005

int n, m, x, y, a [270000], init [nmax];


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

void cnstr (int st, int dr, int poz)
{
	if (st == dr)
	{	
		init [st]=poz;
		return;
	}
	int mij=(st+dr)/2;
	cnstr (st, mij, poz*2);
	cnstr (mij+1, dr, (poz*2)+1);
}

void update (int poz, int val)
{
	int k=init [poz];
	a [k]=val;
	for (k/=2; k; k/=2)
		a [k]=max (a [k*2], a [(k*2)+1]);
}

int caut (int st, int dr, int poz)
{
	if (x <= st && dr <= y)
		return a [poz];
	if (x > dr || st > y)
		return 0;
	int mij=(st+dr)/2;
	return max (caut (st, mij, poz*2), caut (mij+1, dr, (poz*2)+1));
}

void scan ()
{
	int i;
	scanf ("%d%d", &n, &m);
	cnstr (1, n, 1);
	for (i=1; i <= n; ++i)
	{
		scanf ("%d", &x);
		update (i, x);
	}
}

int main ()
{
	freopen ("arbint.in", "r", stdin);
	freopen ("arbint.out", "w", stdout);
	scan ();
	int i, tip;
	for (i=1; i <= m; ++i)
	{
		scanf ("%d%d%d", &tip, &x, &y);
		if (tip == 0)
			printf ("%d\n", caut (1, n, 1));
		else
			update (x, y);
	}
	return 0;
}