C1540 [Ynoi]2016-B

内存限制:512 MB 时间限制:2000 ms

题目描述

您正在打 galgame,然后突然家长进来了,于是您假装在写数据结构题:

给一个树,$n$ 个点,有点权,初始根是 $1$。

$m$ 个操作,每次操作:

  1. 将树根换为 $x$。
  2. 给出两个点 $x$,$y$,从 $x$ 的子树中选每一个点,$y$ 的子树中选每一个点,如果两个点点权相等,$ans++$,求 $ans$。

输入格式

第一行两个数表示 $n$,$m$。

第二行 $n$ 个数,表示每个点的点权 $a[i]$。

之后 $n−1$ 行,每行两个数 $x,y$,表示一条边。

之后 $m$ 行,每行为1 x或者2 x y

1 x,表示将根变成 $x$ 点。

2 x y,表示查询 $x$ 点的子树与 $y$ 点的子树。

输出

对于每个询问,输出一个数表示答案。

样例

样例输入 1

5 5 1 2 3 4 5 1 2 1 3 3 4 3 5 2 4 5 2 1 5 2 3 5 1 5 2 4 5

样例输出 1

0 1 1 1

提示

$n \le 100000 , m \le 500000 , 1 \le a[i] \le 1000000000$