Cod sursa(job #609902)

Utilizator soriynSorin Rita soriyn Data 23 august 2011 19:24:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>

#define dim 100005

int Arb[dim*4+66];
int N,M,start,finish,val,pos,maxim,op,a,b;

int max(int a,int b)
{
	if(a>b) return a;
	else return b;
}


void Update(int nod,int left,int right)
{
	if(left==right)
	{
		Arb[nod]=val;
		return;
	}
	
	int mij=(left+right)/2;
	if(pos<=mij) Update(2*nod,left,mij);
	else Update(2*nod+1,mij+1,right);
	Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}
		

void Query(int nod,int left,int right)
{
	if(start<=left && right <=finish)
	{
		if(maxim<Arb[nod])
			maxim=Arb[nod];
			return;
			
    }		
	
	int mij=(left+right)/2;
	if(start<=mij) Query(2*nod,left,mij);
	if(mij<finish) Query(2*nod+1,mij+1,right);
}
	

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d %d",&N,&M);
	int x;
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&x);
		val=x;
		pos=i;
        Update(1,1,N);
	}

   for(int i=1;i<=M;i++)

   {
	   scanf("%d %d %d",&op,&a,&b);
	   if(op==0)
	   {
		   maxim=-1;
		   start=a,finish=b;
		   Query(1,1,N);
		   printf("%d\n",maxim);
	   }
	   if(op==1)
	   {
		   pos=a,val=b;
		   Update(1,1,N);
	   }
   }
}