fn dfs(cur: usize, prev: usize, paths: &Vec>, dp: &mut Vec) { let mut ret = 1usize; for &v in paths[cur].iter() { if v == prev { continue; } dfs(v, cur, paths, dp); ret += dp[v]; } dp[cur] = ret; } fn main() { let mut nq = String::new(); std::io::stdin().read_line(&mut nq).ok(); let nq: Vec = nq.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let n = nq[0]; let q = nq[1]; let mut paths = vec![vec![]; n]; for _ in 0..n-1 { let mut ab = String::new(); std::io::stdin().read_line(&mut ab).ok(); let ab: Vec = ab.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let a = ab[0]-1; let b = ab[1]-1; paths[a].push(b); paths[b].push(a); } let queries = (0..q).map(|_| { let mut temp = String::new(); std::io::stdin().read_line(&mut temp).ok(); let temp: Vec = temp.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); (temp[0]-1, temp[1]) }) .collect::>(); let mut dp = vec![0usize; n]; dfs(0, 0, &paths, &mut dp); let mut result = 0usize; for &(p, x) in queries.iter() { result += dp[p] * x; println!("{}", result); } }