Cod sursa(job #562092)

Utilizator darkseekerBoaca Cosmin darkseeker Data 22 martie 2011 11:55:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>
using namespace std;

#define Input "arbint.in"
#define Output "arbint.out"
#define NMAX 1<<16+5

int arb[NMAX],pos,val,middle,maxim,start,final;

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

void update(int node,int left,int right)
{
	if(left==right)
	{
		arb[node]=val;
		return;
	}
	middle=(left+right)/2;
	if(pos<=middle)
		update(2*node,left,middle);
	else
		update(2*node+1,middle+1,right);
	arb[node]=max(arb[2*node],arb[2*node+1]);
}

void query(int node,int left,int right)
{
	if(start<=left && right<=final)
		{
			if(maxim<arb[node])
				maxim=arb[node];
			return;
	}
	middle=(right+left)/2;
	if(start<=middle)
		query(2*node,left,middle);
	if(middle<final)
		query(2*node+1,middle+1,right);
	
}
/*
void Update(int nod, int left, int right)
{
     if ( left == right )
     {
          MaxArb[nod] = Val;
          return;
     }
     
     int div = (left+right)/2;
     if ( Pos <= div ) Update(2*nod,left,div);
     else              Update(2*nod+1,div+1,right);
     
     MaxArb[nod] = Maxim( MaxArb[2*nod], MaxArb[2*nod+1] );
}

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

*/
int main()
{
	int n,m,i,type,v1,v2;
	freopen (Input,"r",stdin);
	freopen (Output,"w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&val);
		pos=i;
		update(1,1,n);
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&type,&v1,&v2);
		if(type==0)
		{
			start=v1;
			final=v2;
			maxim=0;
			query(1,1,n);
			printf("%d\n",maxim);
		}	
		else
		{
			pos=v1;
			val=v2;
			update(1,1,n);
		}
	}
}