Cod sursa(job #662383)

Utilizator valentina506Moraru Valentina valentina506 Data 16 ianuarie 2012 17:13:30
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
#include<algorithm>
using namespace std;
long n,m,i,j,a[600001],x,A,B,tip;

void schimba(long nod,long st,long dr, long poz, long val)
{
	long mij;
	if(st==dr)
		a[nod]=val;
	else
	{
		mij=(st+dr)/2;
		if(poz<=mij)
			schimba(2*nod,st,mij,poz,val);
		else
			if(poz>mij)
				schimba(2*nod+1,mij+1,dr,poz,val);
			a[nod]=max(a[2*nod],a[2*nod+1]);
	}
	
}

void detmax(long nod,long st,long dr, long A, long B)
{
	long mij;
	
	if(A<=st&&B>=dr)
	{
		if(a[nod]>x)
		x=a[nod];
		return;
	}
	else
	{
		mij=(st+dr)/2;
		if(A<=mij)
			detmax(2*nod,st,mij,A,B);
		else
			if(mij<B)
			detmax(2*nod+1,mij+1,dr,A,B);
	}
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=n;++i)
	{
		scanf("%ld",&x);
		schimba(1,1,n,i,x);
	}
	
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%d",&tip,&A,&B);
		if(tip==1)
			schimba(1,1,n,A,B);
		else
		{
			x=0;
			detmax(1,1,n,A,B);
			printf("%ld\n",x);
		}
	}
	return 0;
}