Cod sursa(job #445296)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 23 aprilie 2010 13:56:03
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream.h>
#include<algorithm>

using namespace std;

#define maxim(a, b) ((a > b) ? a : b)

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

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

char s[2000005];

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

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

int main()
{
	int i,m,op;
	f>>n>>m;
	f.get();
	f.getline(s,2000000);
	n=1;
	k=strlen(s);
	for (i=0;i<k;i++)
		if (s[i]==' ')
			++n;
		else
			v[n]=v[n]*10+s[i]-'0';
	
	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<<max1[1]<<"\n";
		}
		else
		{
			k=1;
		//	update();
		}
	}
	f.close();
	g.close();
	return 0;
}