Pagini recente » Cod sursa (job #1941281) | Cod sursa (job #1017144) | Cod sursa (job #1637146) | Cod sursa (job #1785301) | Cod sursa (job #2955654)
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMAX = 1e5 + 1;
const int MAXLOG = 18;
int t[NMAX],k[NMAX],dp[NMAX],lift[MAXLOG][NMAX];//lift[i][j] = al 2 ^ i ulea stramos al lui j
vector<int> fii[NMAX];
bool rad[NMAX];
void blift(int n)
{
for(int i = 1; i <= n ; i++) lift[0][i] = t[i];
for(int i = 1; (1 << i) <= n ; i++)
{
for(int j = 1; j <= n ; j++)
{
lift[i][j] = lift[i - 1][lift[i - 1][j]];
}
}
}
int query(int nod,int anc)
{
for(int i = 0 ; i < MAXLOG ; i++)
{
if(anc & (1 << i))
nod = lift[i][nod];
}
return nod;
}
void dinamica(int nod)
{
if(k[nod] == 0)
{
dp[nod] = 0;
}
else
{
dp[nod] = 1 + dp[query(nod,k[nod])];
}
for(auto it : fii[nod])
dinamica(it);
}
int main()
{
int n,a,b; fin >> n;
for(int i = 1; i <= n ; i++) fin >> k[i];
for(int i = 1; i < n ; i++)
{
fin >> a >> b;
rad[b] = 1;
t[b] = a;
fii[a].push_back(b);
}
blift(n);
int root = -1;
for(int i = 1; i <= n ; i++)
{
if(!rad[i])
{
root = i;
break;
}
}
dinamica(root);
for(int i = 1; i <= n ; i++) fout << dp[i] << " ";
return 0;
}