Cod sursa(job #841622)

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

#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[])
{
	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\n",&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;
}