Cod sursa(job #600206)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 30 iunie 2011 20:12:45
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>

#define max(a,b) ((a)<(b))?(b):(a)

void UpdateHeap(int *heap,int nod,int left,int right,int i,int val)
{
	if(left==right){
		heap[nod] = val;
		return;
	}

	int mid = (left+right)/2;
	if(i<=mid)
		UpdateHeap(heap,2*nod,left,mid,i,val);
	else
		UpdateHeap(heap,2*nod+1,mid+1,right,i,val);
	heap[nod] = max(heap[2*nod],heap[2*nod+1]);
}

int GetMax(int *heap,int nod,int left,int right,int a,int b)
{
	if(a<=left && right<=b)
		return heap[nod];

	int maxim = 2147483648;
	int mid = (left + right)/2;
	if(a<=mid)
		maxim = GetMax(heap,2*nod,left,mid,a,b);
	if(b>mid)
		maxim = max(maxim,GetMax(heap,2*nod+1,mid+1,right,a,b));

	return maxim;
}

int main(int argc, char* argv[])
{
	int *heap;
	int i;
	heap = new int[300000];

	for(i=1;i<300000;++i)
		heap[i] = 2147483648;

	int N,M;

	FILE *fpr,*fpw;
	fpr = fopen("arbint.in","r");
	fpw = fopen("arbint.out","w");

	fscanf(fpr,"%d %d",&N,&M);
	int val;
	for(i=1;i<=N;i++){
		fscanf(fpr,"%d",&val);
		UpdateHeap(heap,1,1,N,i,val);
	}
	int tip,A,B;
	for(i=1;i<=M;i++){
		fscanf(fpr,"%d %d %d",&tip,&A,&B);
		if(tip==0)
			fprintf(fpw,"%d\n",GetMax(heap,1,1,N,A,B));
		else
			UpdateHeap(heap,1,1,N,A,B);
	}
	
	delete heap;
	fclose(fpr);
	fclose(fpw);
	return 0;
}