Cod sursa(job #775019)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 7 august 2012 02:37:42
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>
#define LE 100600
#define inf 1<<30
#define zero(X) ((X^(X-1))&X)
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int V[LE],A[LE],n,m,tip,aa,bb,j;
inline int query(int a,int b)
{
   int 	rez=-inf;
   int i;
	for(i=b;i>=a;)
	{
		if (i-zero(i)+1>=a) 
			rez=max(rez,A[i]),i-=zero(i);
		else rez=max(rez,V[i]),--i;
	}
	return rez;
}

inline void update(int p,int val)
{
	V[p]=val; int i;
    for(i=p;i<=n;i+=zero(i))
	{
       A[i]=max(query(i-zero(i)+1,p-1),query(p+1,i));
	   A[i]=max(A[i],val);
	   A[i]=max(A[i],V[i]);
	}		
}

int main()
{
	f>>n>>m;
	for(j=1;j<=n;++j)
	{	
		f>>V[j];
		update(j,V[j]);
    }
	
	for(j=1;j<=m;++j)
	{
		 f>>tip>>aa>>bb;
		 if (tip==0) g<<query(aa,bb)<<'\n';
		 else update(aa,bb);
	}
	f.close();g.close();
	return 0;
}