题目描述
这是问题的困难版本。在此版本中,保证所有查询的 r≥l+k−1。
对于任意数组 b,Yunli 可以执行以下操作任意次数:
- 选择一个索引 i。设置 bi=x,其中 x 是她想要的任何整数(x 不限于区间 [1,n])。
将 f(b) 表示为她需要执行的最小操作数,直到 b 中存在长度至少为 k 的连续子数组*。
Yunli 收到一个大小为 n 的数组 a,并询问 q 次。在每次查询中,你需要计算 ∑j=l+k−1rf([al,al+1,…,aj])。
* 如果存在一个长度为 k 的连续子数组,从索引 i 开始(1≤i≤∣b∣−k+1),那么对于所有 i<j≤i+k−1,bj=bj−1+1。
输入格式
第一行包含 t(1≤t≤104)——测试用例的数量。
每个测试用例的第一行包含三个整数 n、k 和 q(1≤k≤n≤2⋅105,1≤2⋅105)——数组的长度、连续子数组的长度和查询次数。
下一行包含 n 个整数 a1,a2,…,an(1≤ai≤n)。
以下 q 行包含两个整数 l 和 r(1≤l≤r≤n,r≥l+k−1)——查询的边界。
保证所有测试用例中 n 的总和不超过 2⋅105,所有测试用例的 q 总和不超过 2⋅105。
输出格式
对于每组测试数据上的每次查询,输出 ∑j=l+k−1rf([al,al+1,…,aj])。
样例
3
7 5 3
1 2 3 2 1 2 3
1 7
2 7
3 7
8 4 2
4 3 1 1 2 4 3 2
3 6
1 5
5 4 2
4 5 1 2 3
1 4
1 5
6
5
2
2
5
2
3
样例说明
在第一组测试用例的第二次查询中,我们计算了以下函数值:
- f([2,3,2,1,2])=3,因为 Yunli 可以设置 b3=4、b4=5 和 b5=6,从而在 3 次操作中形成一个大小为 5 的连续子阵列。
- f([2,3,2,1,2,3])=2,因为我们可以设置 b3=0 和 b2=−1,在 2 次操作中中(从位置 2 开始)形成一个大小为5的连续子阵列。
这个查询的答案是 3+2=5。
翻译 @Cure_Wing。
来源
Codeforces 2009G2,英文题名 Yunli's Subarray Queries (hard version)。