Cod sursa(job #793796)

Utilizator MtkMarianHagrSnaf MtkMarian Data 4 octombrie 2012 10:28:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<cstdio>

using namespace std;

#define NMAX 100001

long a[4*NMAX+66],val,max=-1;
int p,s,f;
bool t;

inline int maxim(int a,int b)
{
	return a < b ? b : a;
}

void update(int nod ,int left,int right)
{
	if( left == right)
	{
		a[nod]=val;
		return;
	}	

	int div=(left+right)/2;

	if(p <= div)update(2*nod,left,div);

		else	
			update(2*nod+1,div+1,right);

	a[nod]=maxim( a[2*nod] , a[2*nod+1] );
}

void solve(int nod,int l,int r)
{

	if(s <= l && r <= f)
	{

	if(max < a[nod] )max=a[nod];	
	return;

	}

	int div=(r+l)/2;

	if(s<=div)solve(2*nod , l , div);	
	if(div<f)solve((2*nod)+1 , (div+1) , r);

}


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

	for(int i=1;i<=n;++i)
	{
		scanf("%d",&val);
		p=i;		
		update(1,1,n);

	}

	for(int i=1;i<=m;++i)
	{
		
		scanf("%d %d %d",&t,&p,&val);
		
		if(t==1)
		{			
			update(1,1,n);
		}
		else
		{
			max=-1;
			s=p;//start
			f=val;//finish
			solve(1,1,n);
			printf("%d\n",max);
			
		}
		
	}


	return 0;
}