Cod sursa(job #612406)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 7 septembrie 2011 14:38:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream>
using namespace std;
int n,N,m,A[300010];
int a,b,maxim;

void ConstruireArbore()
{
	int i;
	for(i=N-1;i>0;i--)
		A[i]=max(A[2*i],A[2*i+1]);
}

void Query(int nod,int st,int dr)
{
	if(a<=st && dr<=b)
	{
		maxim=max(maxim,A[nod]);
		return;
	}
	int mij=(st+dr)/2;
	if(a<=mij) Query(2*nod,st,mij);
	if(mij+1<=b) Query(2*nod+1,mij+1,dr);
}

void Update()
{
	int k=N+a-1;
	A[k]=b;
	k=k/2;
	while(k>0)
	{
		A[k]=max(A[2*k],A[2*k+1]);
		k=k/2;
	}
}

int main()
{
	int i,op;
	ifstream fin("arbint.in");
	fin>>n>>m;
	
	N=1;
	while(n>N)
		N=N*2;
	
	for(i=1;i<=n;i++)
		fin>>A[N+i-1];
	
	ConstruireArbore();
	
	ofstream fout("arbint.out");
	for(i=1;i<=m;i++)
	{
		fin>>op>>a>>b;
		if(op==0)
		{
			maxim=0;
			Query(1,1,N);
			fout<<maxim<<"\n";
		}
		else
			Update();
	}
	
	fin.close();
	fout.close();
	return 0;
}