Cod sursa(job #841634)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 24 decembrie 2012 15:37:22
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>

#define MAXN 100000

int arb[4*MAXN];
int v[MAXN];
int M,N;

int position,value,intLeft,intRight;

inline void BuildArbInt(int node, int left, int right)
{
	if( left == right ){
		arb[node] = v[left];
		return;
	}
	int node2 = 2*node;
	int mid = (left+right)/2;
	BuildArbInt(node2,left,mid);
	BuildArbInt(node2+1,mid+1,right);
	
	register int unu = arb[node2];
	register int doi = arb[node2+1];
	
	if( unu > doi )
		arb[node] = unu;
	else
		arb[node] = doi;
}

inline void ChangeValue(int node, int left, int right)
{
	if( left == right ){
		arb[node] = value;
		return;
	}
	
	int mid = (left+right)/2;
	register int node2 = 2*node;
	if(position <= mid )
		ChangeValue(node2,left,mid);
	else
		ChangeValue(node2+1,mid+1,right);
	
	register int unu = arb[node2];
	register int doi = arb[node2+1];
	
	if( unu > doi )
		arb[node] = unu;
	else
		arb[node] = doi;
}

inline int GetMax(int node, int left, int right)
{
	if( intLeft <= left && right<=intRight){
		return arb[node];
	}
	
	int node2 = 2*node;
	int mid = (left+right)/2;
	// left ( left, mid ) , right( mid + 1 , right )
	int val1=0,val2=0;
	if( intLeft <= mid )
		val1 = GetMax(node2,left,mid);
	if( intRight > mid )
		val2 = GetMax(node2+1,mid+1,right);
		
	if( val1 > val2 )
		return val1;
	return val2;
}

int main(int argc, char* argv[])
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	int i,op,a,b;
	for(i=1;i<=N;i++){
		scanf("%d",&a);
		v[i] = a;
	}

	BuildArbInt(1,1,N);

	for(i=0;i<M;i++){
		scanf("%d%d%d",&op,&a,&b);
		if( op == 0 ){
			intLeft = a;
			intRight = b;
			printf("%d\n",GetMax(1,1,N));
		}
		else{
			position = a;
			value = b;
			ChangeValue(1,1,N);
		}
	}
	
	return 0;
}