Pagini recente » Cod sursa (job #131561) | Cod sursa (job #1149315) | Cod sursa (job #2886916) | Cod sursa (job #253704) | Cod sursa (job #2438675)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int lg = 17;
vector <int> g[100005];
int d[100005][20], nr[100005], k[100005], n;
bool tata[100005];
void read(){
fin >> n;
for (int i = 1; i <= n; i++)
fin >> k[i];
for (int i = 1; i < n; i++){
int a, b;
fin >> a >> b;
g[a].push_back(b);
d[b][0] = a;
tata[b] = 1;
}
}
void dfs1(int nod){
for (auto i : g[nod]){
for (int j = 1; j <= lg; j++)
d[i][j] = d[d[i][j - 1]][j - 1];
dfs1(i);
}
}
void dfs2(int nod){
int p = k[nod], x = nod;
if (p > 0){
for (int j = lg; j >= 0; j--)
if (p & (1 << j))
x = d[x][j];
nr[nod] = nr[x] + 1;
}
for (auto i : g[nod])
dfs2(i);
}
void solve(){
int rad = 0;
for (int i = 1; i <= n; i++)
if(!tata[i])
rad = i;
dfs1(rad);
dfs2(rad);
}
void print(){
for (int i = 1; i <= n; i++)
fout << nr[i] << ' ';
fout << '\n';
}
int main()
{
read();
solve();
print();
return 0;
}