提交记录
#include <iostream>
#include <algorithm>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
using lint = long long;
const int N = 2e5 + 10;
struct Data {
int a, t, id, st;
} arr[N];
lint s[N];
int T, ans, n, c;
bool check(int k, int i, int lim) {
int cost;
if (i > k) {
cost = s[k];
} else {
cost = s[k + 1] - arr[i].t;
}
return cost <= lim;
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
for (std::cin >> T; T; --T) {
std::cin >> n >> c, ans = 0;
for (int i = 1; i <= n; ++i) {
std::cin >> arr[i].a;
arr[i].st = (arr[i].id = i) + arr[i].a;
arr[i].t = min(i, n + 1 - i) + arr[i].a;
}
std::sort(arr + 1, arr + n + 1, [](const Data &p, const Data &q){
return p.t < q.t;
});
for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + arr[i].t;
for (int i = 1; i <= n; ++i) {
if (arr[i].a + arr[i].id > c) continue;
int l = -1, r = n;
while (l + 1 != r) {
int mid = l + r >> 1;
if (check(mid, i, c - arr[i].a - arr[i].id)) l = mid;
else r = mid;
}
ans = max(ans, l + 1);
}
std::cout << ans << '\n';
}
std::cout.flush();
return 0;
}