Cod sursa(job #404754)

Utilizator dan_10Dan Alexandru dan_10 Data 26 februarie 2010 17:29:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<fstream.h>

using namespace std;

long n,m,v[600000],op,a,b,x,poz,maxi;

void arbore(long nod,long st,long dr)
{
	if(st==dr)
	{	v[nod]=x;
		return;
	}
	long mij=(st+dr)/2;
	if(poz<=mij) arbore(2*nod,st,mij);
	else arbore(2*nod+1,mij+1,dr);
	
	if(v[2*nod]>v[2*nod+1]) v[nod]=v[2*nod];
	else v[nod]=v[2*nod+1];
}

void cauta(long nod,long st,long dr)
{
	if(a<=st && dr<=b)
	{	if(maxi<v[nod]) maxi=v[nod];
		return ;
	}
	long mijl=(st+dr)/2;
	if(a<=mijl) cauta(nod*2,st,mijl);
	else cauta(nod*2+1,mijl+1,dr);
}

int main()
{		
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(int i=1;i<=n;i++)
	{	
		scanf("%ld",&x);
		poz=i;
		arbore(1,1,n);
	}
	
	for(int i=1;i<=m;i++)
	{	scanf("%ld%ld%ld",&op,&a,&b);
		if(op==0)
		{	
			maxi=-1;
			cauta(1,1,n);
			printf("%ld\n",maxi);
		}
		else 
		{
			poz=a;
			x=b;
			arbore(1,1,n);
		}
	}
	return 0;
	
}