#L2050. 「HNOI2016」树

    ID: 4605 传统题 1000ms 256MiB 尝试: 3 已通过: 1 难度: 10 上传者: 标签>搜索DFS数据结构线段树划分树可持久化数据结构

「HNOI2016」树

题目描述

小 A 想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了。

开始,小 A 只有一棵结点数为 NN 的树,结点的编号为 1,2,,N1, 2, \ldots ,N,其中结点 11 为根;我们称这颗树为模板树。小 A 决定通过这棵模板树来构建一颗大树。构建过程如下:

  1. 将模板树复制为初始的大树。
  2. 以下 (2.1)(2.1) (2.2)(2.2) (2.3)(2.3) 步循环执行 MM 次。
    • (2.1)(2.1) 选择两个数字 a,ba, b,其中 1aN1 \leq a \leq N, 1b1 \leq b \leq 当前大树的结点数。
    • (2.2)(2.2) 将模板树中以结点 aa 为根的子树复制一遍,挂到大树中结点 bb 的下方(也就是说,模板树中的结点 aa 为根的子树复制到大树中后,将成为大树中结点 bb 的子树)。
    • (2.3)(2.3) 将新加入大树的结点按照在模板树中编号的顺序重新编号。例如,假设在进行 (2.2)(2.2) 步之前大树有 LL 个结点,模板树中以 aa 为根的子树共有 CC 个结点,那么新加入模板树的 CC 个结点在大树中的编号将是 L+1,L+2,,L+CL+1, L+2, \cdots ,L+C;大树中这 CC 个结点编号的大小顺序和模板树中对应的 CC 个结点的大小顺序是一致的。

下面给出一个实例。假设模板树如下图:

根据第 (1)(1) 步,初始的大树与模板树是相同的。在 (2.1)(2.1) 步,假设选择了 a=4a=4b=3b=3。运行 (2.2)(2.2)(2.3)(2.3) 后,得到新的大树如下图所示:

(这里结点 66 是复制出的子树根,它对应模板树中 44 号结点,挂在大树 33 下面)

现在他想问你,树中一些结点对的距离是多少。

输入格式

第一行三个整数:N,M,QN, M, Q,以空格隔开,NN 表示模板树结点数,MM 表示第 (2)(2) 中的循环操作的次数,QQ 表示询问数量。

接下来 N1N-1 行,每行两个整数 fr,to\text{fr}, \text{to},表示模板树中的一条树边。

再接下来 MM 行,每行两个整数 x,tox, \text{to},表示将模板树中 xx 为根的子树复制到大树中成为结点 to\text{to} 的子树的一次操作。

再接下来 QQ 行,每行两个整数 fr,to\text{fr}, \text{to},表示询问大树中结点 fr\text{fr}to\text{to} 之间的距离是多少。

输出格式

输出 QQ 行,每行一个整数,第 ii 行是第 ii 个询问的答案。

样例

输入

5 2 3
1 4
1 3
4 2
4 5
4 3
3 2
6 9
1 8
5 3

输出

6
3
3

解释
经过两次操作后,大树变成了下图所示的形状:

结点 6699 之间经过了 66 条边,所以距离为 66;类似地,结点 1188 之间经过了 33 条边;结点 5533 之间也经过了 33 条边。

数据范围与提示

对于 100%100\% 的数据,N,M,Q100000N, M, Q \leq 100000