Pagini recente » Cod sursa (job #205702) | Cod sursa (job #1433938) | Cod sursa (job #2137988) | Cod sursa (job #2645414) | Cod sursa (job #1887527)
#include <fstream>
#include <cstdio>
#include <cmath>
#define Nmax 100001
using namespace std;
ofstream g("cerere.out");
int n,K[Nmax],DP[17][Nmax],rez[Nmax];
int stramos(int nod,int k)
{
if (k==0)
return nod;
int x = log2(k);
return stramos(DP[x][nod],k-(1<<x));
}
int check(int nod,int k)
{
int s = stramos(nod,k);
if (rez[s]==0 && K[s]!=0)
rez[s] = check(s,K[s]);
return rez[s]+1;
}
int main()
{
freopen("cerere.in","r",stdin);
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&K[i]);
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
DP[0][y] = x;
}
int mx = log2(n);
for (int i=1;i<=mx;i++)
for (int j=1;j<=Nmax;j++)
DP[i][j] = DP[i-1][DP[i-1][j]];
for (int i=1;i<=n;i++)
{
if (rez[i]==0 && K[i]!=0)
rez[i] = check(i,K[i]);
g<<rez[i]<<' ';
}
return 0;
}