Cod sursa(job #164708)

Utilizator mariussMarius Telespan mariuss Data 24 martie 2008 18:24:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
#define nmax 100010

int v[nmax<<1],val[nmax],n,m;


inline int MAX (int a, int b)
{
	if(a>b)
		return a;
	else 
		return b;
}
	
void make_a(int x, int y,int p)
{
	if(x==y)
	{
		v[p]=val[x];
		return;
	}
	int mij=(x+y)>>1;
	
	make_a(x,mij,p<<1);
	make_a(mij+1,y,(p<<1)+1);
	v[p]=MAX(v[p<<1],v[(p<<1)+1]);
}

int query(int x,int y,int p,int a, int b)
{
	if(a<=x && y<=b)
		return v[p];
	
	int mij,mx=0;
	
	mij=(x+y)>>1;
	
	if(a<=mij)
		mx=MAX(mx,query(x,mij,p<<1,a,b));
	if(b>=mij+1)
		mx=MAX(mx,query(mij+1,y,(p<<1)+1,a,b));
		
	return mx;	
		
}

void update(int x, int y,int p,int a, int val)
{
	if(x==y)
	{
		v[p]=val;
		return;
	}
	
	
	int mij;
	
	mij=(x+y)>>1;
	
	if(a<=mij)
		update(x,mij,p<<1,a,val);
	if(a>=mij+1)
		update(mij+1,y,(p<<1)+1,a,val);
	
	v[p]=MAX(v[p<<1],v[ (p<<1)+1]);
		
}

int main()
{
	int i,cod,a,b;
	
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	scanf("%d %d",&n,&m);

	for(i=1;i<=n;i++)
		scanf("%d",&val[i]);
	
	make_a(1,n,1);
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&cod,&a,&b);
		if(cod==0)
			printf("%d\n",query(1,n,1,a,b));
		else
			update(1,n,1,a,b);
		
	}
	
	return 0;
}