Cod sursa(job #841573)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 24 decembrie 2012 14:11:54
Problema Arbori de intervale Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.69 kb
#include <stdio.h>

#define MAXN 100000

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


int max(int a, int b)
{
	if( a > b )
		return a;
	else
		return b;
}

void ChangeValue(int node, int left, int right, int position, int value)
{
//	printf("Change value (node %d, left %d, right %d, position %d\n",node,left,right,position);
	if( left == right ){
//		printf("Setez %d la %d \n",value,node);
		arb[node] = value;
		return;
	}
	
	int mid = (left+right)/2;
	if(position<=mid)
		ChangeValue(2*node,left,mid,position,value);
	else
		ChangeValue(2*node+1,mid+1,right,position,value);
	
//	printf("Max Left = %d, Max Right = %d\n",arb[2*node],arb[2*node+1]);
	arb[node] = max(arb[2*node],arb[2*node+1]);
//	printf("Change value (node %d, left %d, right %d, max %d\n",node,left,right, arb[node]);
}

int GetMax(int node, int left, int right, int intLeft, int intRight)
{
//	printf("Get max (node %d, left %d, right %d, intLeft %d, intRight %d\n",node,left,right,intLeft,intRight);
	if( intLeft <= left && right<=intRight){
		return arb[node];
	}
	
	int mid = (left+right)/2;
	// left ( left, mid ) , right( mid + 1 , right )
	int val1=0,val2=0;
	if( intLeft <= mid )
		val1 = GetMax(node*2,left,mid,intLeft,intRight);
	if( intRight > mid )
		val2 = GetMax(node*2+1,mid+1,right,intLeft,intRight);
		
	return max(val1,val2);
}

int main(int argc, char* argv[])
{
	FILE *fin,*fout;
	fin = fopen("arbint.in","r");
	fout = fopen("arbint.out","w");
	
	fscanf(fin,"%d %d",&M,&N);
	int i,op,a,b;
	for(i=0;i<N;i++){
		fscanf(fin,"%d",&a);
		ChangeValue(1,1,N,i+1,a);
	}

	for(i=0;i<M;i++){
		fscanf(fin,"%d %d %d",&op,&a,&b);
		if( op == 0 )
			fprintf(fout,"%d\n",GetMax(1,1,N,a,b));
		else
			ChangeValue(1,1,N,a,b);
	}
	
	fclose(fin);
	fclose(fout);
	
	return 0;
}