Pagini recente » Cod sursa (job #2168779) | Cod sursa (job #2707698) | Cod sursa (job #1529265) | Cod sursa (job #1151487) | Cod sursa (job #1076773)
#include <stdio.h>
int nr,stiva[100001],t[100001],k[100001],last[100001],next[100001],val[100001],v[100001];
char trecut[100001];
void dfs(int nod){
int poz;
trecut[nod]=1;
nr++;
stiva[nr]=nod;
if(k[nod]!=0){
v[nod]=1+v[stiva[nr-k[nod]]];
}
poz=last[nod];
while(poz!=0){
if(trecut[val[poz]]==0){
dfs(val[poz]);
}
poz=next[poz];
}
nr--;
}
int main(){
int n,i,x,y,radacina;
FILE *fin,*fout;
fin=fopen("cerere.in","r");
fout=fopen("cerere.out","w");
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++){
fscanf(fin,"%d",&k[i]);
}
for(i=1;i<=n;i++){
fscanf(fin,"%d%d",&x,&y);
t[y]++;
val[i]=y;
next[i]=last[x];
last[x]=i;
}
radacina=0;
i=1;
while(radacina==0){
if(t[i]==0){
radacina=i;
}
i++;
}
dfs(radacina);
for(i=1;i<=n;i++){
fprintf(fout,"%d ",v[i]);
}
fprintf(fout,"\n");
fclose(fin);
fclose(fout);
return 0;
}