Cod sursa(job #1553705)

Utilizator D4n13LMuntean Dan Iulian D4n13L Data 20 decembrie 2015 13:31:27
Problema Arbori de intervale Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.31 kb
#include<stdio.h>
#include<stdlib.h>


typedef struct{
	int st;
	int dr;
}interval;

typedef struct nod{
	interval I;
	struct nod * st;
	struct nod * dr;
}TNod,*Tarb;

Tarb buildNode(int i, int j)
{
	Tarb aux = (Tarb )malloc(1 * sizeof(TNod));
	aux->st = NULL;
	aux->dr = NULL;
	(aux->I).st = i;
	(aux->I).dr = j;
	return aux;
}

Tarb buildTree(int i, int j)
{
	Tarb root = buildNode(i,j);
	if(i == j)
		return root;
	int mij = (i+j)/2;
	root->st= buildTree(i,mij);
	root->dr= buildTree(mij+1,j);
	return root;
}

int Imax(Tarb root,int a,int b,int * v)
{
	if(a == b)
		return v[a];
	int i = (root->I).st;
	int j = (root->I).dr;
	int mij = (i+j)/2;
	if(b <= mij)
		return Imax(root->st,a,b,v);
	if( a > mij)
		return Imax(root->dr,a,b,v);
	int max1 = Imax(root->st,a,mij,v);
	int max2 = Imax(root->dr,mij+1,b,v);
	return (max1 > max2) ? max1:max2;
}

int main(void)
{
	FILE * fin = fopen("arbint.in","rt");
	FILE * fout = fopen("arbint.out","wt");
	int n,m,i;
	fscanf(fin,"%d%d",&n,&m);
	int *v = (int*) calloc(n+1, sizeof(int));
	for(i = 1; i <= n ;i++)
		fscanf(fin,"%d",v+i);

	Tarb root = buildTree(1,n);
	int op,a,b;
	for(i = 0; i < m; i++)
	{
		fscanf(fin,"%d%d%d",&op,&a,&b);
		if(op == 0)
		{
			int max = Imax(root,a,b, v);
			fprintf(fout,"%d\n",max);
		}
		else
		{
			v[a] = b;
		}
	}
	fclose(fin);
	fclose(fout);


	return 0;
}