/*
找最小值中的最大值 ,是之满足条件,果断二分
*/
#include <stdio.h>
int n,m;
bool judge(const int *a,int key)
{
int sum=0;
int count=0;
for(int i=0;i<n;i++)
{
sum += a[i];
if(sum>key)
{
sum=a[i];
count++;
}
}
if((count+1)<=m)
return 1;
return 0;
}
void binary(const int *a,int left,int right)
{
while(left<right)
{
int mid=(left+right)/2;;/// left+((right-left)>>1)
if(judge(a,mid))
{
right = mid;
}
else
{
left = mid+1;
}
}
printf("%d\n",left); // ,right %d
}
int main()
{
int t;
int a[505];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int left=0;
int right=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
right += a[i];
if(a[i]>left)
{
left = a[i];
}
}
binary(a,left,right);
}
return 0;
}