Pagini recente » Cod sursa (job #3201607) | Cod sursa (job #2851676) | Cod sursa (job #1364016) | Clasament preONI 2007, Clasa a 10-a | Cod sursa (job #2476174)
#include <iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=100005;
int k[N];
bool tata[N];
vector<int> gr[N];
int dp[N];
int vf=0;
int stv[N];
int stramos(int nod,int k){
return stv[vf-k];
}
void dfs(int nod,int tata){
stv[++vf]=nod;
if(k[nod]==0)
dp[nod]=0;
else{
int strm=stramos(nod,k[nod]);
dp[nod]=1+dp[strm];
}
for(auto x:gr[nod]){
if(x!=tata){
dfs(x,nod);
}
}
vf--;
}
int main()
{
FILE*fin,*fout;
fin=fopen("cerere.in","r");
fout=fopen("cerere.out","w");
int n;
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++){
fscanf(fin,"%d",&k[i]);
}
for(int i=1;i<n;i++){
int x,y;
fscanf(fin,"%d%d",&x,&y);
tata[y]=true;
gr[x].push_back(y);
}
for(int i=1;i<=n;i++){
if(tata[i]==0){
dfs(i,0);
break;
}
}
for(int i=1;i<=n;i++){
fprintf(fout,"%d ",dp[i]);
}
return 0;
}