血压游戏
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

Compute 有一棵 n 个点,编号分别为 的树,其中 s 号点为根。
Compute 在树上养了很多松鼠,在第 i 个点上住了 a_i 个松鼠。
因为某些缘故,它们开始同时向根节点移动,但它们相当不安分,如果在同一个节点上,它们就会打起来,简单地来说以下事件会依序发生:
  • 如果一个节点上有 2 只或 2 只以上的松鼠,他们会打架,然后这个节点上松鼠的数量会减少 1;
  • 根节点的所有松鼠移动到地面,位于地面上的松鼠不会再打架;
  • 所有松鼠同时朝它们的父节点移动。
所有事件各自都在一瞬间完成,直至树上没有松鼠。
现在 Compute 想知道最终有多少只松鼠到达了地面。

输入描述:

第一行包含两个整数 n, s (, ),中间以空格分隔,分别表示点的数量和根的编号。
第二行包含 n 个整数 (),中间以空格分隔,分别表示每个点上一开始的松鼠数量。
接下来 n-1 行,每行包含两个整数 u, v (, ),中间以空格分隔,表示 u 和 v 之间有一条边。
输入保证是一棵树。

输出描述:

在一行输出一个整数,表示最终到达地面的松鼠数量。
示例1

输入

复制
3 1
2 4 6
1 2
1 3

输出

复制
8
示例2

输入

复制
3 1
0 1 1
1 2
1 3

输出

复制
1