Cod sursa(job #863039)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector<int> v[100001];
int n,m,x,y;
int intreaba[100001],sol[100001],t[100001];
bool calculat[100001];
int arbdfs[100001];
void dfs(int nod,int nivel)
{
arbdfs[nivel] = nod;
if(intreaba[nod]==0)
sol[nod] = 1;
else sol[nod] = 1 + sol[arbdfs[nivel-intreaba[nod]]];
for(unsigned int i=0;i<v[nod].size();i++)
{
dfs(v[nod][i],nivel+1);
}
}
void calculeaza(int maimuta)
{
if(intreaba[maimuta]==0)
sol[maimuta] = 0;
else
{
int tata = maimuta;
for(int i=1;i<=intreaba[maimuta];i++)
tata = t[tata];
if(!calculat[tata])
calculeaza(tata);
sol[maimuta] = 1 + sol[tata];
}
calculat[maimuta] = true;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
{
fin>>intreaba[i];
}
for(int i=1;i<n;i++)
{
fin>>x>>y;
t[y] = x;
v[x].push_back(y);
}
//getting root
int root = 1;
while(t[root]!=0)
root = t[root];
dfs(root,1);
for(int i=1;i<=n;i++)
{
fout<<sol[i]-1<<' ';
}
fin.close();
fout.close();
return 0;
}