Pagini recente » Cod sursa (job #3361168) | Cod sursa (job #3361163) | Cod sursa (job #3361171) | Cod sursa (job #3361149) | Cod sursa (job #3361150)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
const int MAX_N = 100000;
vector<int> adj[MAX_N + 1];
int sol[MAX_N + 1],
crt[MAX_N + 1];
int k[MAX_N + 1],
t[MAX_N + 1];
int n, root;
void Read()
{
f >> n;
for(int i = 1; i <= n; i++)
f >> k[i];
for(int i = 1; i < n; i++)
{
int x, y;
f >> x >> y;
adj[x].push_back(y);
t[y] = x;
}
}
void GetRoot()
{
root = 1;
while(t[root] != 0)
root++;
}
void DFS(int node, int level)
{
crt[level] = node;
if(k[node] == 0)
sol[node] = 0;
else
sol[node] = 1 + sol[crt[level - k[node]]];
for(int child : adj[node])
DFS(child, level + 1);
}
void PrintSol()
{
for(int i = 1; i <= n; i++)
g << sol[i] << ' ';
g << '\n';
}
int main()
{
Read();
GetRoot();
DFS(root, 1);
PrintSol();
f.close();
g.close();
return 0;
}