Cod sursa(job #906118)

Utilizator Kira96Denis Mita Kira96 Data 6 martie 2013 15:21:22
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int x,a,b,n,m,i,M,v[200010],OK,t,j,ind,poz;
int ma(int a,int b)
{
	if(a>b)
	return a;
	return b;
}
void update(int st,int dr,int nr)
{
	int m=(st+dr)>>1;
	if(OK)
	v[nr]=ma(v[nr],x);
	if(st==dr)
	{
	ind=st; poz=nr;
	return ;
	}
	if(j>=st&&j<=m)
	update(st,m,nr*2);
	if(j>m&&j<=dr)
	update(m+1,dr,nr*2+1);
}
void find(int st,int dr,int nr)
{
	if(st>=a&&dr<=b)
	M=ma(v[nr],M);
	else
	{
		int m=(st+dr)>>1;
		if(a>m)
		find(m+1,dr,nr*2+1);
		else
		if(a<=m&&b>m)
		{
		find(st,m,nr*2);
		find(m+1,dr,nr*2+1);
		}
		else
		find(st,m,nr*2);
	}
}
void goup(int p)
{
	while(p)
	{
	v[p]=ma(v[2*p],v[2*p+1]);
	p>>=1;
	}
}
int div(int st,int dr,int nr)
{
	if(st==dr)
	poz=nr;
	else
	if(!poz)
	{
		int m=(st+dr)>>1;
		if(a>m)
		div(m+1,dr,nr*2+1);
		else
		div(st,m,nr*2);
	}
}
	
int main ()
{
	OK=1;
	f>>n>>m;
	for(j=1;j<=n;++j)
	{
		f>>x;
		update(1,n,1);
	}
	OK=0;
	for(i=1;i<=m;++i)
	{
		poz=0;
		M=0;
		f>>t>>a>>b;
		
		if(!t)
		find(1,n,1);
		else
		{
		div(1,n,1);
		v[poz]=b;
		goup(poz>>1);
		}
		if(!t)
		g<<M<<"\n";
	}
	return 0;
}