Cod sursa(job #726250)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 27 martie 2012 09:16:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
const int lg=100005;
int init[lg],t[4*lg],a,b,rez;

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

//construire arbore
void construiesc(int st, int dr, int poz)
{

	if(st==dr)
	{
	 init[st]=poz;
	 return;
	}
	int x=(st+dr)/2;
	construiesc(st,x,2*poz);
	construiesc(x+1,dr,2*poz+1);
}
//***Actualizare***
void actualizez(int poz, int val)
{
   int x=init[poz];
       t[x]=val;
	   x>>=1;
	   while(x)
	   {
	   t[x]=max(t[2*x],t[2*x+1]);
	   x>>=1;
	   }
}
//***Interogare***
void interogare(int st, int dr, int poz)
{
	if(st>b || dr<a)  return;
	if( a<=st&& dr<=b )
		rez=max(rez,t[poz]);
	else
		if(st<dr)
		{
		int x=(st+dr)/2;
		interogare(st, x,poz*2);
		interogare(x+1,dr,poz*2+1);
		}
}

int main()
{
int i,x,n,m;
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
	scanf("%d %d",&n,&m);
	construiesc(1,n,1);
	

	for(i=1;i<=n;i++)
	{
	  scanf("%d",&x);
	  actualizez(i,x);  
	}
	
	for(i=1;i<=m;i++)
	{
	  scanf("%d %d %d",&x,&a,&b);
	    if(!x)
		{
		rez=0;
		interogare(1,n,1);
		printf("%d\n",rez);
		}
	else
		actualizez(a,b);
	}
	
	return 0;
	
}