时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述

有一棵结点总数为

且根节点编号为

的有根树,第

个结点的权值为

。
一个结点称为"支撑结点"当且仅当其满足以下所有条件:
上层结点:除自身结点以外的祖先节点。
下层结点:除自身结点以外的子孙节点。
1.该结点的所有上层结点权值之和
大于等于当前结点的权值(如果无上层结点,则其权值之和为

)。
2.该结点的所有下层结点权值之和
小于等于当前结点的权值(如果无下层结点,则其权值之和为

)。
一棵有根树的稳定值为该有根树"支撑结点"的个数,为了让这棵树的稳定值达到最大,

得到了一次删除树边的机会(
可以不删除),即选择两个结点

(

是

的父节点),然后把连接

的边删除,即把以

为根的子树删除。请你帮助他计算出该有根树可能达到的最大稳定值。
注:当选择删除子树时,该子树的支撑结点不计入答案。
请回忆:
- 祖先结点:沿树根到某一结点路径上的所有结点都是这个结点的祖先结点;
- 子孙结点:某一结点的子树中的所有结点是这个结点的子孙;
输入描述:
第一行一个整数
,表示该有根树的结点个数。
第二行包含
个整数,第
个数为
,表示第
个结点的权值。
第三行包含
个整数,第
个数为
,表示第
个结点的父亲结点的编号,特别地
。
输出描述:
一个整数,表示该有根树可能达到的最大稳定值。
示例2
输入
复制
6
10 10 3 10 7 40
0 1 1 2 3 4
备注:
对于样例一:无需删边。
对于样例二:删除结点4和结点6的边即可。