#include <bits/stdc++.h>
using namespace std;
using ll = long long;
/*
QUESTION IN SIMPLE WORDS
------------------------
We have a rooted tree.
Each node has a value.
For each node u, compute:
sum of value[v] * distance(u, v)
for all nodes v in subtree(u)
------------------------------------------------------------
BRUTE FORCE IDEA
------------------------------------------------------------
For every node u:
- iterate through all nodes in subtree(u)
- compute distance(u, v)
- add value[v] * distance(u, v)
------------------------------------------------------------
WHY BRUTE FORCE IS TOO SLOW
------------------------------------------------------------
If we do this separately for every node,
time can become O(n^2).
------------------------------------------------------------
OPTIMIZED IDEA
------------------------------------------------------------
Use one DFS.
For each node u, keep:
sub[u] = sum of values in subtree(u)
ans[u] = required weighted sum for subtree(u)
Suppose v is a child of u.
Then every node in subtree(v) is 1 edge farther from u
than it is from v.
So contribution of child subtree to ans[u] is:
ans[v] + sub[v]
*/
struct TreeImpact {
int n;
vector<ll> a;
vector<ll> sub;
vector<ll> ans;
vector<vector<int>> g;
TreeImpact(int n, const vector<ll>& a) : n(n), a(a) {
g.assign(n + 1, {});
sub.assign(n + 1, 0);
ans.assign(n + 1, 0);
}
void addEdge(int u, int v) {
g[u].push_back(v);
g[v].push_back(u);
}
void dfs(int u, int p) {
// Start with u itself
sub[u] = a[u];
ans[u] = 0;
for (int v : g[u]) {
if (v == p) continue;
dfs(v, u);
// Add child subtree value
sub[u] += sub[v];
// All nodes in child subtree become 1 farther from u
ans[u] += ans[v] + sub[v];
}
}
vector<ll> solve(int root = 1) {
dfs(root, 0);
return ans;
}
};
int main() {
int n = 5;
vector<ll> a = {0, 3, 2, 5, 10, 7};
TreeImpact solver(n, a);
solver.addEdge(1, 2);
solver.addEdge(1, 3);
solver.addEdge(2, 4);
solver.addEdge(2, 5);
auto ans = solver.solve(1);
for (int i = 1; i <= n; i++) {
cout << ans[i] << ' ';
}
cout << '\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKCi8qClFVRVNUSU9OIElOIFNJTVBMRSBXT1JEUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV2UgaGF2ZSBhIHJvb3RlZCB0cmVlLgpFYWNoIG5vZGUgaGFzIGEgdmFsdWUuCgpGb3IgZWFjaCBub2RlIHUsIGNvbXB1dGU6CnN1bSBvZiB2YWx1ZVt2XSAqIGRpc3RhbmNlKHUsIHYpCmZvciBhbGwgbm9kZXMgdiBpbiBzdWJ0cmVlKHUpCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQlJVVEUgRk9SQ0UgSURFQQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KRm9yIGV2ZXJ5IG5vZGUgdToKLSBpdGVyYXRlIHRocm91Z2ggYWxsIG5vZGVzIGluIHN1YnRyZWUodSkKLSBjb21wdXRlIGRpc3RhbmNlKHUsIHYpCi0gYWRkIHZhbHVlW3ZdICogZGlzdGFuY2UodSwgdikKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXSFkgQlJVVEUgRk9SQ0UgSVMgVE9PIFNMT1cKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCklmIHdlIGRvIHRoaXMgc2VwYXJhdGVseSBmb3IgZXZlcnkgbm9kZSwKdGltZSBjYW4gYmVjb21lIE8obl4yKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpPUFRJTUlaRUQgSURFQQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVXNlIG9uZSBERlMuCgpGb3IgZWFjaCBub2RlIHUsIGtlZXA6CnN1Ylt1XSA9IHN1bSBvZiB2YWx1ZXMgaW4gc3VidHJlZSh1KQphbnNbdV0gPSByZXF1aXJlZCB3ZWlnaHRlZCBzdW0gZm9yIHN1YnRyZWUodSkKClN1cHBvc2UgdiBpcyBhIGNoaWxkIG9mIHUuCgpUaGVuIGV2ZXJ5IG5vZGUgaW4gc3VidHJlZSh2KSBpcyAxIGVkZ2UgZmFydGhlciBmcm9tIHUKdGhhbiBpdCBpcyBmcm9tIHYuCgpTbyBjb250cmlidXRpb24gb2YgY2hpbGQgc3VidHJlZSB0byBhbnNbdV0gaXM6CmFuc1t2XSArIHN1Ylt2XQoqLwoKc3RydWN0IFRyZWVJbXBhY3QgewogICAgaW50IG47CiAgICB2ZWN0b3I8bGw+IGE7CiAgICB2ZWN0b3I8bGw+IHN1YjsKICAgIHZlY3RvcjxsbD4gYW5zOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBnOwoKICAgIFRyZWVJbXBhY3QoaW50IG4sIGNvbnN0IHZlY3RvcjxsbD4mIGEpIDogbihuKSwgYShhKSB7CiAgICAgICAgZy5hc3NpZ24obiArIDEsIHt9KTsKICAgICAgICBzdWIuYXNzaWduKG4gKyAxLCAwKTsKICAgICAgICBhbnMuYXNzaWduKG4gKyAxLCAwKTsKICAgIH0KCiAgICB2b2lkIGFkZEVkZ2UoaW50IHUsIGludCB2KSB7CiAgICAgICAgZ1t1XS5wdXNoX2JhY2sodik7CiAgICAgICAgZ1t2XS5wdXNoX2JhY2sodSk7CiAgICB9CgogICAgdm9pZCBkZnMoaW50IHUsIGludCBwKSB7CiAgICAgICAgLy8gU3RhcnQgd2l0aCB1IGl0c2VsZgogICAgICAgIHN1Ylt1XSA9IGFbdV07CiAgICAgICAgYW5zW3VdID0gMDsKCiAgICAgICAgZm9yIChpbnQgdiA6IGdbdV0pIHsKICAgICAgICAgICAgaWYgKHYgPT0gcCkgY29udGludWU7CgogICAgICAgICAgICBkZnModiwgdSk7CgogICAgICAgICAgICAvLyBBZGQgY2hpbGQgc3VidHJlZSB2YWx1ZQogICAgICAgICAgICBzdWJbdV0gKz0gc3ViW3ZdOwoKICAgICAgICAgICAgLy8gQWxsIG5vZGVzIGluIGNoaWxkIHN1YnRyZWUgYmVjb21lIDEgZmFydGhlciBmcm9tIHUKICAgICAgICAgICAgYW5zW3VdICs9IGFuc1t2XSArIHN1Ylt2XTsKICAgICAgICB9CiAgICB9CgogICAgdmVjdG9yPGxsPiBzb2x2ZShpbnQgcm9vdCA9IDEpIHsKICAgICAgICBkZnMocm9vdCwgMCk7CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgaW50IG4gPSA1OwogICAgdmVjdG9yPGxsPiBhID0gezAsIDMsIDIsIDUsIDEwLCA3fTsKCiAgICBUcmVlSW1wYWN0IHNvbHZlcihuLCBhKTsKICAgIHNvbHZlci5hZGRFZGdlKDEsIDIpOwogICAgc29sdmVyLmFkZEVkZ2UoMSwgMyk7CiAgICBzb2x2ZXIuYWRkRWRnZSgyLCA0KTsKICAgIHNvbHZlci5hZGRFZGdlKDIsIDUpOwoKICAgIGF1dG8gYW5zID0gc29sdmVyLnNvbHZlKDEpOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNvdXQgPDwgYW5zW2ldIDw8ICcgJzsKICAgIH0KICAgIGNvdXQgPDwgJ1xuJzsKCiAgICByZXR1cm4gMDsKfQ==