Pagini recente » Cod sursa (job #1664330) | Cod sursa (job #1801837) | Cod sursa (job #1446798) | Cod sursa (job #162931) | Cod sursa (job #2940376)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100002
#define LMAX 20
using namespace std;
vector<int> v[NMAX];
int n,x,y,dp[NMAX][LMAX],vf[NMAX],k[NMAX];
/// dp[i][j] = al 2^j-lea stramos al nodului i
ifstream fin("cerere.in");
ofstream fout("cerere.out");
void dfs(int nod){
vf[nod] = 1;
for(auto vecin: v[nod]){
if(vf[vecin] == 0){
dp[vecin][0] = nod;
for(int j = 1; j < LMAX; j++){
dp[vecin][j] = dp[dp[vecin][j-1]][j-1];
}
dfs(vecin);
}
}
}
int getstramos(int nod, int m){
/// al m-lea stramos al lui nod
for(int j = LMAX-1; j >= 0; j--){
if(m&(1<<j)){ /// are bit-ul j setat
nod = dp[nod][j];
}
}
return nod;
}
int main()
{
fin >> n;
for(int i = 1; i <= n; i++){
fin >> k[i];
}
for(int i = 1; i < n; i++){
fin >> x >> y;
v[x].push_back(y);
}
dfs(1);
for(int i = 1; i <= n; i++){
int cnt = 0;
int nod = i;
while(k[nod] != 0){
cnt++;
nod = getstramos(nod, k[nod]);
}
fout << cnt << " ";
}
return 0;
}