【题目描述】
小 S 正在整理一批层层归档的资料,小 N 则不断提出需要核对的范围。为了能够统一处理这些树上查询任务,小 S 将资料之间的层级关系整理成一棵以结点 1 为根、共有 n 个结点的有根树。
结点按照一次深度优先遍历中首次访问的顺序编号为 1,2,…,n。因此,每个结点的子树中的结点编号构成一个连续区间,并且这个区间的左端点就是该结点本身。
每个结点 i 有一个正整数权值 wi。根结点的深度为 1,其余结点的深度等于其父亲结点的深度加 1。
对于任意非空连续区间 [a,b],记 w(a,b)=∑i=abwi,表示这个区间内所有结点的权值之和。
记 d(a,b)=dep(lca(a,a+1,…,b)),其中 lca(a,a+1,…,b) 表示结点 a,a+1,…,b 的最近公共祖先,dep(u) 表示结点 u 的深度。
小 N 共提出 q 次查询。每次查询给出三个整数 l,r,k,要求小 S 在所有满足 l≤a≤b≤r 且 w(a,b)≥k 的连续区间 [a,b] 中,求出 d(a,b) 的最大值。
换言之,每次查询要求计算
max⎩⎨⎧dep(lca(a,a+1,…,b))l≤a≤b≤r,i=a∑bwi≥k⎭⎬⎫.
保证每次查询均有 k≤w(l,r),因此至少存在一个满足条件的连续区间。
【输入格式】
从文件 query.in 中读入数据。
本题包含多组测试数据。
输入的第一行包含两个非负整数 c,T,分别表示测试点编号与测试数据的组数。c=0 表示该测试点为样例。
对于每组测试数据:
第一行包含两个正整数 n,q,分别表示树的结点数量与查询数量。
第二行包含 n−1 个正整数 p2,p3,…,pn,其中 pi 表示结点 i 的父亲结点。
第三行包含 n 个正整数 w1,w2,…,wn,表示每个结点的权值。
接下来 q 行,每行包含三个正整数 l,r,k,描述一次查询。
输入保证结点编号符合题目描述中的深度优先遍历顺序。
【输出格式】
输出到文件 query.out 中。
对于每次查询,输出一行一个正整数,表示满足条件的连续区间中 d(a,b) 的最大值。
【样例 1 输入】
10 125 431 1 3 342 1 3 2 451 5 663 5 472 4 581 2 3
【样例 1 输出】
【说明/提示】
【样例 1 解释】
对于第一次查询,可以选择区间 [3,5]。该区间的权值之和为 9,其中所有结点的最近公共祖先为结点 3,深度为 2,因此答案为 2。
对于第二次查询,可以选择区间 [5,5]。结点 5 的权值为 4,深度为 3,因此答案为 3。
【样例 2】
见选手目录下的 query/query2.in 和 query/query2.ans。
该组样例符合测试点 1∼2 的数据范围。
【样例 3】
见选手目录下的 query/query3.in 和 query/query3.ans。
该组样例符合测试点 3∼5 的数据范围。
【样例 4】
见选手目录下的 query/query4.in 和 query/query4.ans。
该组样例符合测试点 6∼9 的数据范围。
【样例 5】
见选手目录下的 query/query5.in 和 query/query5.ans。
该组样例符合测试点 10∼13 的数据范围。
【样例 6】
见选手目录下的 query/query6.in 和 query/query6.ans。
该组样例符合测试点 14∼20 的数据范围。
【样例 7】
见选手目录下的 query/query7.in 和 query/query7.ans。
该组样例符合测试点 21∼25 的数据范围。
【数据范围】
对于 100% 的数据,保证 1≤n,q≤2×105,单个测试点内所有测试数据满足 ∑n,∑q≤2×105。
特殊性质 A:对于所有 2≤i≤n,均有 pi=i−1。
特殊性质 B:对于每次查询,均有 k=w(l,r)。
特殊性质 C:对于每次查询,均有 k≤mini=lrwi。
对于所有测试数据,保证:
- 0≤c≤25,1≤T≤10。
- 对于所有 2≤i≤n,均有 1≤pi<i。
- 对于所有 1≤i≤n,均有 1≤wi≤109。
- 对于每次查询,均有 1≤l≤r≤n,1≤k≤w(l,r)。