Cod sursa(job #841611)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 24 decembrie 2012 15:20:07
Problema Arbori de intervale Scor 50
Compilator c Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>

#define MAXN 100000

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

int position,value,intLeft,intRight;


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

void BuildArbInt(int node, int left, int right)
{
	if( left == right ){
		arb[node] = v[left];
		return;
	}
	
	int mid = (left+right)/2;
	BuildArbInt(2*node,left,mid);
	BuildArbInt(2*node+1,mid+1,right);
	
	arb[node] = max(arb[2*node],arb[2*node+1]);
}

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

int GetMax(int node, int left, int right)
{
	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);
	if( intRight > mid )
		val2 = GetMax(node*2+1,mid+1,right);
		
	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",&N,&M);
	int i,op,a,b;
	for(i=0;i<N;i++){
		fscanf(fin,"%d",&a);
		v[i+1] = a;
	}

	BuildArbInt(1,1,N);

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