Cod sursa(job #145740)

Utilizator raduzerRadu Zernoveanu raduzer Data 29 februarie 2008 12:09:30
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>

int n,m,d[400100],c,x,y,p,vp,mx;

void find(int p, int a, int b)
{
	int v=(a+b)/2;
	if (a>=x && b<=y)
	{
		if (mx<d[p]) mx=d[p];
		return;
	}
	if (x<=v) find(p*2,a,v);
	if (y>v) find(p*2+1,v+1,b);
}

void update(int p, int a, int b)
{
	if (a==b)
	{
		d[p]=y;
		return;
	}
	int v=(a+b)/2;
	if (x<=v) update(p*2,a,v);
	else update(p*2+1,v+1,b);
	int mx=d[p*2];
	if (mx<d[p*2+1]) mx=d[p*2+1];
	d[p]=mx;
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j;
	p=0;
	vp=1;
	while (vp<n) vp=1<<(++p);
	for (i=vp; i<vp+n; ++i) 
		scanf("%d",&d[i]);
	for (i=1; i<p; ++i)
		for (j=1<<i; j<1<<(i+1); ++j)
		{
			mx=d[j*2];
			if (d[j*2+1]>mx) mx=d[j*2+1];
			d[j]=mx;
		}
	for (i=1; i<=m; ++i)
	{
		scanf("%d%d%d",&c,&x,&y);
		if (c==0)
		{
			mx=-1;
			find(1,1,vp);
			printf("%d\n",mx);
		}
		else
		{
			update(1,1,vp);
		}
	}
	return 0;
}