Pagini recente » Cod sursa (job #2239971) | Cod sursa (job #2508765) | Cod sursa (job #1671061) | Cod sursa (job #470102) | Cod sursa (job #1083311)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
const int MAX_N = 100005;
vector<int> sons[MAX_N];
int top, stack[MAX_N];
int answer[MAX_N];
int to_whom[MAX_N];
void dfs(int node) {
stack[top] = node;
if(to_whom[node] == 0) {
answer[node] = 0;
} else {
answer[node] = answer[stack[top - to_whom[node]]] + 1;
}
++ top;
for_each(sons[node].begin(), sons[node].end(), dfs);
-- top;
}
int main() {
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n, root = 1;
fin >> n;
for(int i = 1; i <= n; ++ i) {
fin >> to_whom[i];
}
for(int i = 1; i < n; ++ i) {
int x, y;
fin >> x >> y;
sons[x].push_back(y);
answer[y] = -1;
while(answer[root] == -1) {
++ root;
}
}
dfs(root);
for(int i = 1; i <= n; ++ i) {
fout << answer[i] << (i == n ? '\n' : ' ');
}
return 0;
}