Cod sursa(job #445286)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 23 aprilie 2010 13:33:06
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream.h>


ifstream f("arbint.in");
ofstream g("arbint.out");

int ai[280000],st[280000],dr[280000],max[280000],v[100005],n,a,b,k;

void update ()
{
	if (st[k]==dr[k])
	{
		ai[k]=b;
		return ;
	}
	
	if (a<=(st[k]+dr[k])/2)
	{
		k<<=1;
		update();
		k>>=1;
	}
	else
	{
		k<<=1;
		++k;
		update();
		k>>=1;
	}
	ai[k]=ai[2*k];
	if (ai[2*k]<=ai[2*k+1])
		ai[k]=ai[2*k+1];
}

void querry ()
{
	if (a<=st[k] && dr[k]<=b)
	{
		max[k]=ai[k];
		return ;
	}
	
	max[2*k]=-1;
	max[2*k+1]=-1;
	if (a<=(st[k]+dr[k])/2)
	{
		k<<=1;
		querry();
		k>>=1;
	}
	if (b>(st[k]+dr[k])/2)
	{
		k<<=1;
		k++;
		querry();
		k>>=1;
	}
	
	if (max[2*k]==-1)
		max[k]=max[2*k+1];
	else
		if (max[2*k+1]==-1)
			max[k]=max[2*k];
		else
			if (max[2*k]>max[2*k+1])
				max[k]=max[2*k];
			else
				max[k]=max[2*k+1];
}
	
void init ()
{
	if (st[k]==dr[k])
	{
		ai[k]=v[st[k]];
		return ;
	}
	
	st[2*k]=st[k];
	dr[2*k]=(st[k]+dr[k])/2;
	st[2*k+1]=dr[2*k]+1;
	dr[2*k+1]=dr[k];
	k*=2;
	init();
	k++;
	init();
	k/=2;
	ai[k]=ai[2*k];
	if (ai[k]<ai[2*k+1])
		ai[k]=ai[2*k+1];
}

int main()
{
	int i,m,op;
	f>>n>>m;
	for (i=1;i<=n;i++)
		f>>v[i];
	st[1]=1;dr[1]=n;k=1;
	init();
	for (i=1;i<=m;i++)
	{
		f>>op>>a>>b;
		if (op==0)
		{
			k=1;
			querry();
			g<<max[1]<<"\n";
		}
		else
		{
			k=1;
			update();
		}
	}
	f.close();
	g.close();
	return 0;
}