跑路
题号:NC25908
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给出一棵 n 点树, 1 号点为根
有 l 个人从根出发,沿最短路径跑到各自的目的地
每个人都会将经过的点(含根和目的地)打上标记
你可以指定每一个人的目的地
你需要最大化打标记的点数
m 次询问,每次询问给出参数 d ,要求所有人的目的地到根的距离不超过 d
(两点间距离为两点间边数)

精简版
n 点树, m 次询问,每次给出参数 d ,选出 l 条一端为根的长度 的路径
使路径并内点数最大,求这个最大值

输入描述:

第一行两个正整数 n, m
第二行 n-1 个正整数,其中第 i 个数 f_i 表示点 i+1 与 f_i 之间有一条边
(保证
第三行一个正整数 l
第四行 m 个非负整数,为每次询问的参数 d

输出描述:

m 行,每行一个正整数
其中第 i 行为第 i 次询问对应的最大点数
示例1

输入

复制
6 3
1 1 3 3 3
2
0 1 2

输出

复制
1
3
4
示例2

输入

复制
9 2
1 1 2 4 4 5 6 3
2
3 4

输出

复制
6
7

备注:

20% , 
40% ,
80% ,
100% ,
对于所有数据 ,