Cod sursa(job #906153)

Utilizator Kira96Denis Mita Kira96 Data 6 martie 2013 15:54:15
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int x,a,b,n,m,i,M,v[1<<19],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;
	v[nr]=ma(v[nr],x);
	if(st==dr)
	return ;
	if(j<=m)
	update(st,m,nr<<1);
	else
	update(m+1,dr,(nr<<1)+1);
}
void find(int st,int dr,int nr)
{
	if(st>=a&&dr<=b)
	M=ma(v[nr],M);
	else
	if(st!=dr)
	{
		int m=(st+dr)>>1;
		if(a<=m)
		find(st,m,(nr<<1));
		if(b>m)
		find(m+1,dr,(nr<<1)+1);
	}
}
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 ()
{
	
	f>>n>>m;
	for(j=1;j<=n;++j)
	{
		if(j==40949)
		j=j;
		f>>x;
		update(1,n,1);
	}
	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;
}