技能树
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 1024 M,其他语言2048 M
Special Judge, 64bit IO Format: %lld

题目描述

小强玩的游戏中有一个技能树系统。

技能树是一棵1 号节点为根节点的树,树上的每个节点均为一个技能。小强可以使用金币点亮技能树上的技能以获取战斗力。点亮一个技能的前提是点亮它父节点上的技能特别地,根节点可以被直接点亮

每个技能有一个战力值,小强每点亮一个技能获得的战斗力计算方法如下:

  1. 将从根节点到该技能的路径上所有技能(包括根节点和该技能)的战力值从小到大排序。
  2. 排序后,第 \lfloor \frac{x}{2} \rfloor + 1 小的战力值即为小强点亮该技能获得的战斗力。(其中 x 为从根节点到该技能的路径上所有技能的数量 )

与此同时,小强每点亮一个技能需要一枚金币,且技能不能被重复点亮。小强可以不使用完这 m 枚金币。

小强现在有 m 枚金币,他希望能够通过这 m 枚金币最大化他获得的战斗力

  • \lfloor x \rfloor 表示不超过 x 的最大整数,例如 \lfloor 4 \rfloor = 4\lfloor 1.2 \rfloor = 1\lfloor -2.5 \rfloor = -3

输入描述:

首先输入一行两个整数 n, m(1 \le n \le 2 \times 10^4, 1 \le m \le 2 \times 10^3),分别表示技能树上技能的数量和小强拥有的金币个数。

接下来输入一行 n 个整数, v_1, v_2, \dots, v_n(0 \le v_i \le 1\times 10^9),其中 v_i 表示编号为 i 的技能的战力值。

接下来 n - 1 行,每行输入两个整数 u, v(1 \le u, v \le n),表示编号为 u 的技能和编号为 v 的技能之间有一条边。

输出描述:

输出一行一个整数,表示小强可以获取的最大的\textbf{战斗力}。
示例1

输入

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

输出

复制
6

说明

小强可以选择点亮编号分别为 123 的技能。
示例2

输入

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

输出

复制
11

说明

小强可以获得所有技能。小强点亮编号为 1 的技能后可以增加 1 单位的战斗力,点亮编号为 2 与编号为 3 的技能后可以增加 2 单位的战斗力,点亮编号为 4 与编号为 5 的技能后可以增加 3 单位的战斗力。
示例3

输入

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

输出

复制
5