Cod sursa(job #5009)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 9 ianuarie 2007 15:34:02
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
# include <stdio.h>

const int MAX=100000; //AICI!!!! 100000
typedef struct NOD{long int ffiu,nfrate,levelup,sol;};
NOD nod[MAX+1];
long int n,stiva[MAX+1],rad;

void citire()
{
FILE *f=fopen("cerere.in","r");fscanf(f,"%ld",&n);
long int i,p,a,b;int pfr[MAX+1]={0};
for (i=1;i<=n;i++) fscanf(f,"%ld",&nod[i].levelup);
for (i=1;i<=n-1;i++)
	{
	fscanf(f,"%ld%ld",&a,&b);
	pfr[b]=1;
	//a este tatal lui b, deci adaugam un frate la b la sf
	if (nod[a].ffiu==0) nod[a].ffiu=b;
	else
		{
		p=nod[a].ffiu;
		while (nod[p].nfrate!=0) p=nod[p].nfrate;
		nod[p].nfrate=b;
		}
	}
for (i=1;i<=n;i++) if (pfr[i]==0) rad=i;
fclose(f);
}

void df(int k, int nnod)
{
stiva[k]=nnod;
if (nod[nnod].levelup==0) nod[nnod].sol=0;
else nod[nnod].sol=nod[stiva[k-nod[nnod].levelup]].sol+1;
//se pleaca mai departe;
if (nod[nnod].ffiu!=0) df(k+1,nod[nnod].ffiu);
if (nod[nnod].nfrate!=0) df(k,nod[nnod].nfrate);
}

void scrie()
{
FILE *g=fopen("cerere.out","w");
long int i;
for (i=1;i<=n-1;i++) fprintf(g,"%ld ",nod[i].sol);
fprintf(g,"%ld\n",nod[n].sol);
fcloseall();
}

int main()
{
citire();
//parcurgerea df, se mentine stiva, se construieste...
df(1,rad);
scrie();
return 0;
}