Cod sursa(job #148301)

Utilizator sealTudose Vlad seal Data 4 martie 2008 09:15:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#define Nm (1<<17)
#define ls (n<<1)
#define rs (n<<1|1)
#define md (l+r>>1)
#define max(a,b) ((a)>(b)?(a):(b))
int A[Nm],M[Nm<<1];

void build(int n, int l, int r)
{
	if(l==r)
	{
		M[n]=A[l];
		return;
	}
	build(ls,l,md);
	build(rs,md+1,r);
	M[n]=max(M[ls],M[rs]);
}

int a,b,ans;

void update(int n, int l, int r)
{
	if(l==r)
	{
		M[n]=b;
		return;
	}
	if(a<=md)
		update(ls,l,md);
	else
		update(rs,md+1,r);
	M[n]=max(M[ls],M[rs]);
}

void query(int n, int l, int r)
{
	if(a<=l && r<=b)
	{
		ans=max(ans,M[n]);
		return;
	}
	if(a<=md)
		query(ls,l,md);
	if(b>md)
		query(rs,md+1,r);
}

int main()
{
	int n,m,i;

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

	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		scanf("%d",A+i);
	build(1,1,n);

	while(m--)
	{
		scanf("%d%d%d",&i,&a,&b);
		if(i)
			update(1,1,n);
		else
		{
			ans=0;
			query(1,1,n);
			printf("%d\n",ans);
		}
	}
	return 0;
}