给一棵边权为 1 的树和一个常数 C,节点用 1 到 n 的整数表示。
定义 dist(a,b) 为节点 a,b 在树上的距离,即 a 到 b 的简单路径上的边权和,特别地,dist(a,a)=0。
每次查询的时候给出一个区间 [l,r],查询有多少个 C-块,定义如下:
对任意两个节点 a,b,定义 a,b 是 C-连通的,当且仅当存在一个长为 t 的节点序列 {vi},满足:
- v1=a
- vt=b
- 对任意 1≤i≤t−1,dist(vi,vi+1)≤C
- 对任意 1≤i≤t,l≤vi≤r
定义“C-块”为一个点集 S,满足:
- 对任意 a 属于 S,b 属于 S 的补集,a,b 不 C-连通
- 对任意 a,b 属于 S,a 和 b C-连通
- 对任意 a 属于 S,有 l≤a≤r
输入格式
第一行三个数 n,m,C 依次表示树的节点个数,询问次数,还有常数 C;
第二行共 n−1 个数 p2p3…pn,表示对于 2≤i≤n 的整数 i,i 和 pi 之间有一条无向边;
保证输入的数据构成一棵树;
之后 m 行,每行两个数 lr,表示这次询问的区间是 [l,r],保证 l≤r;
保证 1≤n≤3⋅105,1≤m≤6⋅105。
输出格式
共 m 行,依次回答各组询问:每行输出一行一个整数表示这组询问的答案。
样例数据
样例输入
10 9 2
1 1 1 2 3 4 1 1 1
1 3
2 4
3 5
4 6
5 7
6 8
7 9
8 10
5 5
样例输出
1
1
2
3
3
3
2
1
1
子任务
Idea:nzhtl1477,Solution:ccz181078,Code:nzhtl1477&ccz181078,Data:ccz181078
本题有多个子任务,每个子任务可能包含多个测试点,只有通过了一个子任务中的所有测试点才能得到该子任务的分数。
每个子任务的测试点满足一些特殊的限制,具体如下表:
子任务 | 分数 | n≤ | m≤ | C | 性质 1 | 性质 2 |
---|---|---|---|---|---|---|
1 | 4 | 100 | 100 | ≤10 | 否 | 否 |
2 | 4 | 3×105 | 6×105 | =299999 | ||
3 | 16 | =299900 | ||||
4 | 4 | =1 | ||||
5 | 8 | ≤2 | ||||
6 | 8 | ≤3 | ||||
7 | 8 | ≤4 | ||||
8 | 8 | 105 | 105 | ≤3×105 | 是 | |
9 | 4 | 3×105 | 6×105 | |||
10 | 8 | 3×105 | 否 | 是 | ||
11 | 4 | 是 | ||||
12 | 8 | 105 | 2×105 | 否 | 否 | |
13 | 8 | 2×105 | 4×105 | |||
14 | 8 | 3×105 | 6×105 |
其中,性质1、性质2的含义如下:
性质1:存在一个点 w 使得 dist(1,w)=n−1;
性质2:n=m,且第 i 次询问为 l=1,r=i。