Pagini recente » Cod sursa (job #1979445) | Cod sursa (job #1936631) | Cod sursa (job #1520395) | Cod sursa (job #2045918) | Cod sursa (job #1148544)
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int N;
int DP[21][100005];
int cere[100005];
#define DIM 1000000
char buff[DIM];
int poz=DIM-1;
void citeste(int &numar)
{
numar = 0;
while (buff[poz] < '0' || buff[poz] > '9')
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
while ('0'<=buff[poz] && buff[poz]<='9')
{
numar = numar*10 + buff[poz] - '0';
if (++poz == DIM)
fread(buff,1,DIM,stdin),poz=0;
}
}
void read()
{
citeste(N);
for(int i = 1; i <= N; ++i)
citeste(cere[i]);
int a,b;
for(int i = 1; i < N; ++i)
{
citeste(a),citeste(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;
}