解题思路
设区间 [l,r] 的函数值为:
f(l,r)=i=l∑r(t=l∑iat)
也就是说,f(l,r) 是区间 [l,r] 内所有“从左端点开始的前缀和”之和。
题目内容
给定一个长度为n的整数序列a1,a2,…,an。定义
f(l,r)=∑i=lr(∑t=liat)
例如a={1,2,2,3},l=1,r=3:
(f(1,3)=∑i=13(∑t=1iat)=(1)+(1+2)+(1+2+2)=1+3+5=9
现要求在所有n(n+1)/2个区间中,按数值从小到大排序(数值相同按出现次数计入多次),输出第 k小的 (f(l,r) 的值。
输入描述
每个测试文件均包含多组测试数据。第一行输入一个整数 T (1≤T≤105)代表数据组数,每组测试数据描述如下:
- 第一行输入两个整数n,k((1≤n≤2×105, 1≤k≤2n(n+1));
- 第二行输入 n 个整数a1,a2,…,an (0≤ai≤106)。
保证所有测试中 n的总和不超过 5×105。
输出描述
对于每组测试数据,输出一个整数,表示所有区间中第 k 小的f(l,r)的值。
样例1
输入
2
3 2
1 2 3
3 4
2 0 1
输出
2
2
说明
样例一:所有区间及f值为
[1,1]→1, [1,2]→4, [1,3]→10, [2,2]→2, [2,3]→7, [3,3]→3。
从小到大排序为1,2,3,4,7,10,第 2 小为 2。
样例二:f 值从小到大排序为 0,1,1,2,4,7,第 4 小为 2