#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1001000;
ll t,n,a[N],ans,k;
ll check(ll mid)// x就是mid
{
ll i; //下面定个小根堆q
priority_queue<int, vector<int>, greater<int>> q;
for(i=0;i<k;i++) q.push(a[i]); //读入前k个数
while(q.size()!=0) //判断堆是否为空
{
ll p=q.top(); //取堆顶(值最小)
q.pop(); //读入后删除堆顶,腾出空间
if(mid>=p) //先打最小的”怪“
{
mid+=p; //加上最小的”怪“的strength.
if(i<=n) q.push(a[i++]); //加完后就删读入下一个数
}
else return 0; //堆顶最小,mid都还比堆顶小就是false。
}
return 1;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
for(ll i=1;i<=n;i++) cin>>a[i];
ll l=1,r=1e9;
while(l<r)
{
ll mid=l+r>>1; //题目问的最小的x,说明得尽量向左走,对应模板一
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}