Cod sursa(job #472706)

Utilizator andunhillMacarescu Sebastian andunhill Data 26 iulie 2010 14:00:13
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long long N,M,i,x,op,y,max1,poz,val;
long long arbint[400001];
void update(int nod, int left, int right)
{	if(left==right)
	{	arbint[nod]=val;
		return;
	}
	long long mid=(left+right)/2;
	if(poz<=mid)
		update(2*nod,left,mid);
	else
		update(2*nod+1,mid+1,right);
	arbint[nod]=max(arbint[2*nod],arbint[2*nod+1]);
}
void query(int nod, int left, int right)
{	if(x<=left && right<=y)
	{	if(max1<arbint[nod])
		{	max1=arbint[nod];
			return;
		}
	}
	else
	{	long long mid=(left+right)/2;
		if(x<=mid)
			query(nod*2,left,mid);
		if(mid<y)
			query(nod*2+1,mid+1,right);
	}
}

int main()
{	f>>N>>M;
	for(i=1;i<=N;i++)
	{	f>>x;
		poz=i;
		val=x;
		update(1,1,N);
	}
	for(i=1;i<=M;i++)
	{	f>>op>>x>>y;
		if(op==0)
		{	max1=-1;
			query(1,1,N);
			g<<max1<<'\n';
		}
		else
		{	poz=x;
			val=y;
			update(1,1,N);
		}
	}
	f.close();
	g.close();
	return 0;
}