Cod sursa(job #562632)

Utilizator cdascaluDascalu Cristian cdascalu Data 23 martie 2011 16:50:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
#define MAX 262144
using namespace std;
int N,M,ARB[4*MAX+66],l,r,val;
int maxim(int a,int b)
{
	if(a>=b)return a;
	return b;
}
void update(int nod,int left,int right)
{
	if(l<=left && right<=r)
		ARB[nod] = val;
	
	if(left >= right)return;
	
	int mid = left+(right-left)/2;
	
	if(l<=mid)
		update(2*nod,left,mid);
	if(r>mid)
		update(2*nod+1,mid+1,right);
	
	ARB[nod] = maxim(ARB[2*nod], ARB[2*nod+1]);
}
int querry(int nod,int left,int right)
{
	if(l<=left && right<=r)
		return ARB[nod];
	
	if(left>=right)return 0;
	
	int mid = left+(right-left)/2;
	int a = 0,b = 0;
	if(l<=mid)
		a = querry(2*nod, left, mid);
	if(r>mid)
		b = querry(2*nod+1, mid+1,right);
	
	return maxim(a,b);
}
int main()
{
	ifstream f("arbint.in");
	f>>N>>M;
	int i,x,y,c;
	for(i=1;i<=N;++i)
	{
		f>>x;
		l = r = i;
		val = x;
		update(1,1,N);
	}
	ofstream g("arbint.out");
	for(;M;--M)
	{
		f>>c>>x>>y;
		if(c == 0)
		{
			l = x;
			r = y;
			g<<querry(1,1,N)<<"\n";
		}
		else 
		{
			l = r = x;
			val = y;
			update(1,1,N);
		}
	}
	g.close();
	return 0;
}