再帰により、深さを表現する
木以外でも使える(例)
int N, Q;
Graph E(201010); //つながり
int val[201010]; //総合得点
void dfs(int cu, int pa = -1){ //cuを訪問済み(-1)に設定
fore(to, E[cu]) //cuの最小全域木の頂点
if (pa != to) { //訪問済みでないなら
val[to] += val[cu];
dfs(to, cu);
}
}
int main() {
cin >> N >> Q;//頂点数、辺数
rep(i, 0, N - 1) {
int a, b; cin >> a >> b; //繋がり
a--; b--;
E[a].push_back(b);
E[b].push_back(a);
}
rep(q, 0, Q) {
int p, x; cin >> p >> x; //pの最小全域木、x点
p--;
val[p] += x;
}
dfs(0);
rep(i, 0, N) {
if (i) printf(" ");
printf("%d", val[i]);//表示
}
printf("\n");
}