二分
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;
int n, m;
int w[N], pre[N], nex[N];
int check(int x){
nex[n + 1] = 0;
for(int i = 1; i <= n; i++){
pre[i] = pre[i - 1];
if(2 * w[i] < x){
pre[i] ++;
}
}
for(int i = n; i; i--){
nex[i] = nex[i + 1];
if(2 * w[i] < x){
nex[i] ++;
}
}
//从点l到点r有两种方法
//第一种直接过去,此时直径为min(wl, wl + 1, ... , wr);
//第二种将一个权重最小的点temp作为中间点,此时直径为2 * w[temp](x != l && x != r)
//然后取两个方法的最小值
int sum = n;
for(int i = 1; i < n; i++){
//假设一个点小于等于i,一个点大于等于i+1
//他的直径为min(min(wi, wi + 1), 2 * wx)(x != i && x != i + 1)
//pre[i - 1] 记录在i前面的需要改的位置数量
//nex[i + 2] 记录在i + 1后面的需要改的位置数量
//如果wi, wi + 1 小于x,也要进行更改
sum = min(sum, pre[i - 1] + nex[i + 2] + (w[i] < x) + (w[i + 1] < x));
}
return sum <= m;
}
void solve(){
cin >> n >> m;
for(int i = 1;i <= n; i++){
cin >> w[i];
}
int l = 1, r = 1e9 + 1;
while(l < r){
int mid = (l + r) >> 1;
if(check(mid)){
l = mid + 1;
}else{
r = mid;
}
}
cout << l - 1 << "\n";
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
while(t--){
solve();
}
return 0;
}