package main import . "fmt" import . "os" import bf "bufio" func main() { rd:=bf.NewReader(Stdin) wr:=bf.NewWriter(Stdout) defer wr.Flush() var n,q int Fscan(rd,&n,&q) tree := make([][]int, n) for i := 0; i < n-1; i++ { var a,b int Fscan(rd,&a,&b) a-- b-- tree[a] = append(tree[a], b) tree[b] = append(tree[b], a) } count := make([]int, n) visited := make([]bool, n) var dfs func(v int) int dfs = func(v int) int { visited[v] = true c := 1 for _, n := range tree[v] { if !visited[n] { c += dfs(n) } } count[v] = c return c } dfs(0) sum := 0 for i := 0; i < q; i++ { var p, x int Fscan(rd,&p,&x) p-- sum += count[p]*x Fprintln(wr, sum) } } /* 考察 木を作って 各頂点ごとに部分木の頂点の個数を保持 クエリごとにその個数分に増加コストを掛け算した値を全体コストに足して表示すればいいだけ 部分木の個数数えるのが実装一番めんどい? BFS/DFSの戻りで合算する方法のほか 葉から親へ辿るトポソ順ってやつもあるか?(入力からは親子関係不明だから面倒か) */