树与路径
题号:NC201834
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

在一棵有根树 T 上,任何两点间的最短路径都能够分为两个阶段:
  1. 从起点出发,沿着向根的方向走若干条边。
  2. 向着终点,沿着离开根的方向走若干条边。
定义一条路径的权值为向上走的边数乘上向下走的边数。特殊地,当起点等于终点的时候,两阶段的边数都是 0;当起点是终点的祖先的时候,第一阶段的边数是 0;当终点是起点的祖先的时候,第二阶段的边数是 0 ------这三种情况下,路径的权值都是 0。
现在给出一棵 n 个节点的无根树 T 和 m 条路径 (a_i,b_i)。对于每一个 ,你需要计算当 r是根节点的时候,所有路径的权值和是多少。

输入描述:

第一行输入两个整数 
接下来 n-1 行每行输入两个整数 ,表示树上的一条边。
接下来 m 行每行输入两个整数 ,表示一条路径。

输出描述:

输出 n 行每行一个整数,第 i 行表示以 i 为根时,所有路径的权值和。
示例1

输入

复制
5 2
1 2
1 3
3 4
3 5
2 5
4 5

输出

复制
3
1
3
2
0