Cod sursa(job #3230846)

Utilizator AleX102004Alexandru Staiculescu AleX102004 Data 22 mai 2024 23:46:13
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <stdio.h>
#include <stdlib.h>

struct nod{
	struct nod *left,*right;
	int val,limleft,limright;
};

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

struct nod *newNod(){
	struct nod *aux=NULL;
	if((aux=(struct nod*)malloc(sizeof(struct nod)))==NULL){
		printf("Memorie insuficeinta\n");
		exit(1);
	}
	return aux;
}

struct nod *createNod(int v[],int start,int stop){
	struct nod *ret;
	ret=newNod();
	if(start==stop){
		ret->limleft=start;
		ret->limright=stop;
		ret->left=NULL;
		ret->right=NULL;
		ret->val=v[start];
		return ret;
	}
	int mid=start+(stop-start)/2;
	ret->limleft=start;
	ret->limright=stop;
	ret->left=createNod(v,start,mid);
	ret->right=createNod(v,mid+1,stop);
	ret->val=max(ret->left->val,ret->right->val);
	return ret;
}

void freeArb(struct nod *arbint){
	if(arbint->limleft==arbint->limright)
		free(arbint);
	else{
		freeArb(arbint->left);
		freeArb(arbint->right);
		free(arbint);
	}
}

int cautare(struct nod *arbint,int a,int b){
	if(arbint->limleft==a && arbint->limright==b)
		return arbint->val;
	int mid=arbint->limleft+(arbint->limright-arbint->limleft)/2;	
	if(a<=mid && b<=mid)
		return cautare(arbint->left,a,b);
	if(a>mid && b>mid)
		return cautare(arbint->right,a,b);
	if(a<=mid && b>mid)
		return max(cautare(arbint->left,a,mid),cautare(arbint->right,mid+1,b));	
	return -1;
}	

void update(struct nod *arbint,int a,int b){
	if(arbint->limleft==arbint->limright)
		arbint->val=b;
	else{
		int mid=arbint->limleft+(arbint->limright-arbint->limleft)/2;	
		if(a<=mid)
			update(arbint->left,a,b);
		else
			update(arbint->right,a,b);
		arbint->val=max(arbint->left->val,arbint->right->val);
	}
}

int main(){
	int N,M,v[100000],a,b,k;
	FILE *f, *g;
	if((f=fopen("arbint.in","r"))==NULL){
		printf("eroare deschidere fisier\n");
		exit(1);
	}
	if((g=fopen("arbint.out","w"))==NULL){
		printf("eroare deschidere fisier\n");
		exit(1);
	}
	struct nod *arbint;
	fscanf(f,"%d",&N);
	fscanf(f,"%d",&M);
	for(int i=0;i<N;i++){
		fscanf(f,"%d",&v[i]);
	}
	arbint=createNod(v,0,N-1);
	for(int i=0;i<M;i++){
		fscanf(f,"%d",&k);
		fscanf(f,"%d",&a);
		a--;
		fscanf(f,"%d",&b);
		b--;
		switch(k){
			case 0:
				fprintf(g,"%d\n",cautare(arbint,a,b));
				break;
			case 1:
				b++;
				v[a]=b;
				update(arbint,a,b);
		}
	}
	freeArb(arbint);
	fclose(f);
	fclose(g);
	return 0;
}