Pagini recente » Cod sursa (job #1583381) | Cod sursa (job #1140782) | Cod sursa (job #1739355) | Cod sursa (job #2152770) | Cod sursa (job #2940398)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdio>
#define NMAX 100002
#define LMAX 20
#define DIMBUFF 4096
using namespace std;
vector<int> v[NMAX];
char buff[DIMBUFF];
int n,x,y,dp[NMAX][LMAX],vf[NMAX],k[NMAX],rad,pp;
/// dp[i][j] = al 2^j-lea stramos al nodului i
FILE *fin = fopen("cerere.in", "r");
ofstream fout("cerere.out");
int numar() {
int val = 0;
while(!isdigit(buff[pp])){
pp++;
if (pp == DIMBUFF){
fread(buff, 1, DIMBUFF, fin);
pp = 0;
}
}
while(isdigit(buff[pp])) {
val = val*10 + buff[pp] - '0';
pp++;
if(pp == DIMBUFF){
fread(buff, 1, DIMBUFF, fin);
pp = 0;
}
}
return val;
}
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()
{
n = numar();
for(int i = 1; i <= n; i++){
k[i] = numar();
}
for(int i = 1; i < n; i++){
x = numar();
y = numar();
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;
}