Pagini recente » Cod sursa (job #2363335) | Cod sursa (job #2197595) | Cod sursa (job #2037471) | Cod sursa (job #1547340) | Cod sursa (job #1148542)
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int N;
int DP[21][100005];
int cere[100005];
void read()
{
scanf("%d",&N);
for(int i = 1; i <= N; ++i)
scanf("%d",&cere[i]);
int a,b;
for(int i = 1; i < N; ++i)
{
scanf("%d%d",&a,&b);
DP[0][b] = a;
}
}
void dynamic()
{
int len =(int)log2(N);
for(int i = 1; i <= len; ++i)
for(int j = 1; j <= N; ++j)
DP[i][j] = DP[i-1][DP[i-1][j]];
}
int memo[100005];
void solve()
{
memset(memo,-1,sizeof(memo));
int cereri,nodc,k;
for(int nod = 1; nod <= N; ++nod)
{
cereri = 0;
nodc = nod;
while(cere[nodc])
{
++cereri;
k = cere[nodc];
for(int i = 0; i < 20; ++i)
if((1<<i)&k)
{
nodc = DP[i][nodc];
k -= 1<<i;
}
if(memo[nodc] != -1){
cereri += memo[nodc];
break;
}
}
memo[nod] = cereri;
printf("%d\n",cereri);
}
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
read();
dynamic();
solve();
return 0;
}