Cod sursa(job #283829)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 19 martie 2009 23:13:06
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>

#define Inf 0x3f3f3f3f
#define Nmax 200100

#define Fin "arbint.in"
#define Fout "arbint.out"

int arbore[Nmax];
int a,b,n,m;
int i,x,maxim;

inline int max(int a, int b) { return a>b?a:b; }

void interogare(int nod, int st, int dr, int a, int b)
{
	int mij;
	if (st==dr)
	{
		arbore[nod]=b;
	    return ; 
	}
	
	mij=(st+dr)>>1;
	if (a<=mij)
	{
		interogare(2*nod,st,mij,a,b);
	}
	else
	{
		interogare(2*nod+1,mij+1,dr,a,b);
	}
	arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
    
}

void actualizare(int nod, int st, int dr, int a, int b)
{
	int mij;
	if (a<=st && dr<=b)
	{
		maxim=max(maxim,arbore[nod]);
        return ;  	
	}
	
	mij=(st+dr)>>1;
	if (a<=mij)
	{
		actualizare(2*nod,st,mij,a,b);
	}
	else
	{
		actualizare(2*nod+1,mij+1,dr,a,b);
	}
	
}
	
	
	

int main()
{
	freopen(Fin,"r",stdin);
	freopen(Fout,"w",stdout);
	
	scanf("%d %d",&n,&m);
	for (i=1;i<=n;++i)
		{
			scanf("%d", &x);
			interogare(1,1,n,i,x);
		}
	
	while(m--)
	{
		scanf("%d %d %d", &x,&a,&b);
		if (x==0)
		{
			maxim=-Inf;
			actualizare(1,1,n,a,b);
			printf("%d\n", maxim);
		}
		else
		{
			interogare(1,1,n,a,b);
		}
	}
	return 0;
}