Cod sursa(job #923999)

Utilizator raulstoinStoin Raul raulstoin Data 24 martie 2013 00:08:10
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
#define son (nod<<1)
#define mid ((left+right)>>1)
using namespace std;
int n,m,AINT[240005],val,poz,maxim,L,R;
inline int max(int a,int b)
{
	if(a<b)
		return b;
	return a;
}
inline void update(int left,int right,int nod)
{
	if(left==right)
	{
		AINT[nod]=val;
		return;
	}
	if(poz<=mid)
		update(left,mid,son);
	else
		update(mid+1,right,son+1);
	AINT[nod]=max(AINT[son],AINT[son+1]);
}
inline void query(int left,int right,int nod)
{
	if(L<=left && right<=R)
	{
		maxim=max(maxim,AINT[nod]);
		return;
	}
	if(L<=mid)
		query(left,mid,son);
	if(R>mid)
		query(mid+1,right,son+1);
}
int main()
{
	ifstream fin("arbint.in");
	ofstream fout("arbint.out");
	fin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		fin>>val;
		poz=i;
		update(1,n,1);
	}
	for(int i=1;i<=m;i++)
	{
		fin>>val;
		if(val)
		{
			fin>>poz>>val;
			update(1,n,1);
			continue;
		}
		maxim=-1;
		fin>>L>>R;
		query(1,n,1);
		fout<<maxim<<'\n';		
	}
	fin.close();
	fout.close();
	return 0;
}