Cod sursa(job #416952)

Utilizator GotenAmza Catalin Goten Data 13 martie 2010 19:04:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
int n,ai[400100],v[100100],a,b,i,x;
void update(int nod, int st, int dr)
{
	if(st==dr)
		ai[nod]=v[i];
	else
	{
		int m=(st+dr)>>1,ls=nod<<1,rs=1+ls;
		if(i<=m)
			update(ls,st,m);
		else
			update(rs,m+1,dr);
		if(ai[rs]<ai[ls])
			ai[nod]=ai[ls];
		else
			ai[nod]=ai[rs];
	}
}
void query(int nod, int st, int dr)
{
	if(a<=st&&dr<=b)
	{
		if(x<ai[nod])
			x=ai[nod];
	}
	else
	{
		int m=(st+dr)>>1,ls=nod<<1,rs=1+ls;
		if(a<=m)
			query(ls,st,m);
		if(m<b)
			query(rs,m+1,dr);
	}
}	
int main()
{
	int m,op,l=1;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	while(l<n)
		l<<=1;
	n=l;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&v[i]);
		update(1,1,n);
	}
	while(m--)
	{
		scanf("%d",&op);
			if(op)
			{
				scanf("%d %d",&i,&op);
				v[i]=op;
				update(1,1,n);
			}
			else
			{
				scanf("%d %d",&a,&b);
				x=-1;
				query(1,1,n);
				printf("%d\n",x);
			}
	}
	return 0;
}