Pagini recente » Cod sursa (job #237943) | Cod sursa (job #1565981) | Cod sursa (job #885792) | Cod sursa (job #1314) | Cod sursa (job #1076579)
#include<fstream>
#include<vector>
using namespace std;
int rad,k[100005],t[100005],g[100005],rasp[100005],x,y,n,parc[100005];
ifstream in("cerere.in"); ofstream out("cerere.out");
vector <int> l[100005];
int maimuta(int nod){
if(nod==rad || k[nod]==0) return 0;
int crt=nod,nr=0,drum=0;
while(nod!=rad && k[nod]!=0){
crt=nod;
parc[++nr]=nod;
++drum;
for(int i=1;i<=k[nod];++i) crt=t[crt];
nod=crt;
if(rasp[nod]!=0) {drum+=rasp[nod]; break;}
}
for(int i=1;i<=nr;++i)
rasp[parc[i]]=drum-i+1;
return rasp[parc[1]];
}
int main(){
in>>n;
for(int i=1;i<=n;++i) in>>k[i];
for(int i=1;i<n;++i){
in>>x>>y;
g[y]++;
t[y]=x;
l[x].push_back(y); l[y].push_back(x);
}
for(int i=1;i<=n;++i) if(g[i]==0) rad=i;
for(int i=1;i<=n;++i)
out<<maimuta(i)<<' ';
out<<'\n';
return 0;
}