Cod sursa(job #240731)

Utilizator laserbeamBalan Catalin laserbeam Data 8 ianuarie 2009 13:47:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream.h>
long max,n,a[262144],alfabet,ind;

long MaxAB(long alfa, long beta)
{
	if (alfa>beta)return alfa;
	return beta;
}

void Update(long nod, long st, long dr, long poz, long val)
{
	if (st==dr)
	{
		a[nod]=val;
		return;
	}
	int m=(st+dr)/2;
	if (poz<=m)Update(2*nod,st,m,poz,val);
	else Update(2*nod+1,m+1,dr,poz,val);
	a[nod]=MaxAB(a[2*nod],a[2*nod+1]);

}

void Query(long nod, long st, long dr, long start, long finish)
{

	if (start<=st && dr<=finish)
	{
		max=MaxAB(max,a[nod]);
		return;
	}
	long m=(st+dr)/2;
	if (start<=m)Query(2*nod,st,m,start,finish);
	if (m<finish)Query(2*nod+1,m+1,dr,start,finish);

}

int main()
{
long i,X,pos,type,x,y;

ifstream f("arbint.in");
f>>n>>alfabet;
for (i=1;i<=n;i++)
{
	f>>X;
	pos=i;
	Update(1,1,n,pos,X);
}
ofstream g("arbint.out");
for (ind=1;ind<=alfabet;ind++)
{
	f>>type>>x>>y;
	if (type==0)
	{
		max=-1;
		Query(1,1,n,x,y);
		g<<max<<"\n";
	}
	else
	{
		Update(1,1,n,x,y);
	}

}


return 0;
}