树剖分剖树
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

Z有一颗 n 个结点的树 ,结点的编号为 , 结点的点权为 w_i
Z现在给定了一个正整数 k,他希望你告诉他树上有多少个这样的二元组 (u, v) , 满足  且 u 到 v 的最短路径上的点权恰好是一个 的排列。

输入描述:

第一行,包含两个整数 n
第二行,共 n 个整数,表示每个结点的点权。
接下来的 n-1 行,每行包含两个整数 ,代表结点 u_i 和结点 v_i 之间有一条边相连。

输出描述:

输出一行,包含一个整数,如题意所示。
示例1

输入

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

输出

复制
3
示例2

输入

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

输出

复制
0