Pagini recente » Cod sursa (job #1180403) | Cod sursa (job #2591153) | Cod sursa (job #946219) | Cod sursa (job #729437) | Cod sursa (job #2135068)
#include <bits/stdc++.h>
#define Nmax 100001
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int k[Nmax];
int ans[Nmax];
int LOG2[Nmax];
int t[20][Nmax];
int x;
int str(int x, int y)
{
if(!(y&(y-1))) return t[LOG2[y]][x];
return str(t[LOG2[y]][x],y-(1<<LOG2[y]));
}
void solve(int i)
{
if(ans[i]==-1)
{
x=str(i,k[i]);
solve(x);
ans[i]=ans[x]+1;
}
}
int main()
{
int n,i,j,d;
bool ok;
f>>n;
for(i=2;i<=n;i++)
LOG2[i]=LOG2[i>>1]+1;
for(i=1;i<=n;i++)
{
f>>k[i];
if(k[i]) ans[i]=-1;
}
for(d=1;d<n;d++)
{
f>>i>>j;
t[0][j]=i;
}
for(ok=true,i=1;ok;i++)
{
ok=false;
for(j=1;j<=n;j++)
{
t[i][j]=t[i-1][t[i-1][j]];
if(t[i][j]) ok=true;
}
}
for(i=1;i<=n;i++)
solve(i);
for(i=1;i<=n;i++)
g<<ans[i]<<' ';
return 0;
}