Cod sursa(job #387387)

Utilizator tranbachhaiTran Bach Hai tranbachhai Data 27 ianuarie 2010 15:43:08
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>

long left,right,max,m,n,poz,val,v[1<<19];

inline long Max(long a,long b) {return a>b?a:b;}

void update(long nod,long st,long dr)
{
	if (st==dr)
	{
		v[nod]=val;
		return;
	}		
	int mij=(st+dr)>>1;
	if	(poz<=mij)
		update((nod<<1),st,mij);
	else
		update((nod<<1)+1,mij+1,dr);
	v[nod]=Max(v[(nod<<1)],v[(nod<<1)+1]);
}
void query(long nod,long st,long dr)
{
	if(left<=st && dr<=right)
    {
        if(max<v[nod])
            max=v[nod];
        return;
    }
	int mij=(st+dr)>>1;
	if (left<=mij)
		query((nod<<1),st,mij);
	if (mij<right)
		query((nod<<1)+1,mij+1,dr);	
}

int main()
{
long i,temp,x,y,stare;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);

scanf("%ld%ld",&n,&m);

for (i=1;i<=n;++i)
	{
		scanf("%ld",&temp);
		poz=i;
		val=temp;
		update(1,1,n);
	}
for (i=1;i<=m;++i)
	{
		scanf("%ld%ld%ld",&stare,&x,&y);
		if (stare)
			{
				poz=x;
				val=y;
				update(1,1,n);
			}
		else
		{
				max=-1;
				left=x;
				right=y;
				query(1,1,n);
				printf("%ld\n",max);
		}
	}
	
return 0;
}