Cod sursa(job #918221)

Utilizator taigi100Cazacu Robert taigi100 Data 18 martie 2013 18:22:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>

#define max 200010

int arb[max],v[max],nrn,nro;

void InitArb(int node,int left,int right)
{
	if( left==right )
		arb[node]=v[left];
	else
	{
	InitArb(2*node,left,(left+right)/2);
	InitArb(2*node+1,(left+right)/2+1,right);

	if( arb[2*node] >= arb[2*node+1] )
		arb[node]=arb[2*node];
	else
		arb[node]=arb[2*node+1];
	}
}

void Edit( int value, int pos, int left, int right, int node )
{
	if( left<=pos && pos<=right)
	{
		if(left==right) 
			arb[node]=value;
		else
		{
		Edit(value,pos,left,(left+right)/2,2*node);
		Edit(value,pos,(left+right)/2+1,right,2*node+1);

	      if( arb[2*node] >= arb[2*node+1] )
		     arb[node]=arb[2*node];
	      else
		     arb[node]=arb[2*node+1];
		}
	}
}

int Question(int node, int left, int right, int a, int b)
{
	int st=0,dr=0;
	if( a<= left && right<=b )
		return arb[node];
	else
	{
		if( a<= ((left+right)/2) )
			st=Question( 2*node, left, (left+right)/2, a,b);
		if( b > ((left+right)/2) )
			dr=Question( 2*node+1, (left+right)/2+1, right, a, b);
	}
	return ( st>dr ) ? st:dr;
}

void Solve()
{
     InitArb(1,1,nrn);
	 
	 int x,a,b;
	 for(int i=1; i<=nro; i++)
	 {
		 scanf("%d %d %d",&x,&a,&b);
		 
		 switch(x)
		 {
		 case 0:
			 printf("%d\n",Question(1,1,nrn,a,b));
			 break;
		 case 1:
			 Edit(b,a,1,nrn,1);
			 break;
		 default:
			 break;
		 }
	 }
}
void Read_Data()
{
	scanf("%d %d",&nrn,&nro);
	for(int i=1;i<=nrn;i++)
		scanf("%d",&v[i]);
}

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

	Read_Data();
	Solve();
	//Print_Resault();

	return 0;
}