Pagini recente » Cod sursa (job #392904) | Cod sursa (job #3130615) | Cod sursa (job #467821) | Cod sursa (job #1123515) | Cod sursa (job #2940385)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 100002
#define LMAX 20
using namespace std;
vector<int> v[NMAX];
int n,x,y,dp[NMAX][LMAX],vf[NMAX],k[NMAX],rad;
/// dp[i][j] = al 2^j-lea stramos al nodului i
ifstream fin("cerere.in");
ofstream fout("cerere.out");
void dfs(int nod){
for(auto vecin: v[nod]){
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);
vf[y] = x; /// refolosesc vf
}
for(int i = 1; i <= n; i++){
if(vf[i] == 0){
rad = i;
break;
}
}
memset(vf,0,sizeof(vf));
dfs(rad);
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;
}