Pagini recente » Cod sursa (job #2401518) | Cod sursa (job #1102590) | Cod sursa (job #2907527) | Cod sursa (job #25650) | Cod sursa (job #3205569)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
const int nmax = 100000;
vector <int> v[nmax + 5];
int k[nmax + 5];
int p[18][nmax + 5];
int sol[nmax + 5];
int get_k(int nod)
{
int pr = nod;
int kk = k[nod];
for(int j = 17;j>=0;j--)
if((1<<j)<=kk)
kk-=(1<<j),pr=p[j][pr];
return sol[pr];
}
void dfs(int nod)
{
if(k[nod]==0)
sol[nod]=0;
else
sol[nod]=get_k(nod)+1;
for(auto& i : v[nod])
dfs(i);
}
bool viz[nmax + 5];
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>k[i];
for(int i=1;i<n;i++)
{
int x,y;
fin>>x>>y;
v[x].push_back(y);
p[0][y]=x;
viz[y]=true;
}
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n;j++)
p[i][j]=p[i-1][p[i-1][j]];
for(int i=1;i<=n;i++)
if(!viz[i])
dfs(i);
for(int i=1;i<=n;i++)
fout<<sol[i]<<' ';
}