Pagini recente » Cod sursa (job #915846) | Cod sursa (job #1318568) | Cod sursa (job #3204870) | Cod sursa (job #744835) | Cod sursa (job #5009)
Cod sursa(job #5009)
# 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;
}