Pagini recente » Cod sursa (job #1268535) | Cod sursa (job #297860) | Cod sursa (job #3304046) | Cod sursa (job #2168164) | Cod sursa (job #3304047)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("cerere.in");
ofstream out("cerere.out");
const int nmax = 1e5;
int n, a, b, monkey[nmax + 2];
vector <int> muchii[nmax + 2];
int dp[nmax + 2];
int dfsstack[nmax + 2], topp, root;
void dfs(int node, int father){
dfsstack[++topp] = node;
dp[node] = dp[dfsstack[topp - monkey[node]]] + 1;
for(auto nxt : muchii[node]){
if(nxt != father)
dfs(nxt, node);
}
dfsstack[topp--] = node;
}
int main(){
in>>n;
for(int i = 1; i <= n; i++)
in>>monkey[i], root ^= i;
///A -> B => A = father B
///B = one father -> can find root in O(n)
for(int i = 1; i <= n - 1; i++){
in>>a>>b; root ^= b;
muchii[a].push_back(b);
muchii[b].push_back(a);
}
dfs(root, 0);
for(int i = 1; i <= n; i++)
out<<(dp[i] - 1)<<" "; out<<"\n";
return 0;
}