Cod sursa(job #600217)

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

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

int *heap,pos,val,a,b;

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

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

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

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

	return maxim;
}

int main(int argc, char* argv[])
{

	int i;
	heap = new int[500000];

	for(i=1;i<500000;++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);
	for(i=1;i<=N;i++){
		fscanf(fpr,"%d",&val);
		pos = i;
		UpdateHeap(1,1,N);
	}

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