1+ #include " bits/stdc++.h"
2+
3+ using i64 = long long ;
4+
5+ template <typename T, class F = std::function<T(const T&, const T&)>>
6+ struct SegmentTree
7+ {
8+ const int n;
9+ const T null_val;
10+ std::vector<T> tree;
11+ F f;
12+
13+ template <typename G>
14+ SegmentTree (const std::vector<G> in, const T null_val, const F& f)
15+ : n(int (std::size(in))), tree(2 * n, null_val), f(f), null_val(null_val)
16+ {
17+ for (int i = 0 ; i < n; ++i)
18+ tree[i + n] = in[i];
19+
20+ for (int i = n - 1 ; i >= 0 ; i--)
21+ tree[i] = f (tree[i << 1 ], tree[i << 1 | 1 ]);
22+ }
23+ void add (int id, T x)
24+ {
25+ T val = x - get (id, id);
26+ update (id, val);
27+ }
28+ void update (int id, T val)
29+ {
30+ for (tree[id += n] = val; id >>= 1 ; )
31+ tree[id] = f (tree[id << 1 ], tree[(id << 1 ) | 1 ]);
32+ }
33+ T get (int l, int r)
34+ {
35+ T resL = null_val, resR = null_val;
36+ for (l += n, r += n + 1 ; l < r; l >>= 1 , r >>= 1 )
37+ {
38+ if (l & 1 )
39+ resL = f (resL, tree[l++]);
40+ if (r & 1 )
41+ resR = f (tree[--r], resR);
42+ }
43+
44+ return f (resL, resR);
45+ }
46+ };
47+
48+ void solve ()
49+ {
50+ int n, c;
51+ std::cin >> n >> c;
52+
53+ std::vector<int > a (n), cost (n);
54+ std::vector<std::array<i64 , 2 >> b (n);
55+
56+ for (int i = 0 ; i < n; i++)
57+ {
58+ std::cin >> a[i];
59+ b[i] = {a[i] + std::min (i + 1 , n - i), a[i] + i + 1 };
60+ cost[i] = a[i] + std::min (i + 1 , n - i);
61+ }
62+
63+ std::sort (std::begin (b), std::end (b));
64+ std::sort (std::begin (cost), std::end (cost));
65+ SegmentTree<i64 > st (cost, 0 , [&](auto x, auto y){ return x + y; });
66+
67+ int ans = 0 ;
68+ for (int i = 0 ; i < n; i++)
69+ {
70+ if (b[i][1 ] > c)
71+ continue ;
72+
73+ int have = c - b[i][1 ];
74+ int left = 0 , right = n - 1 ;
75+ int cur_ans = -1 ;
76+
77+ int old = cost[i];
78+ st.update (i, 0 );
79+
80+ while (left <= right)
81+ {
82+ int mid = std::midpoint (left, right);
83+
84+ if (st.get (0 , mid) <= have)
85+ cur_ans = mid, left = mid + 1 ;
86+ else
87+ right = mid - 1 ;
88+ }
89+
90+ ans = std::max (ans, cur_ans + 2 - (cur_ans >= i));
91+ st.update (i, old);
92+ }
93+
94+ std::cout << ans << ' \n ' ;
95+ }
96+
97+ int main ()
98+ {
99+ std::ios::sync_with_stdio (false );
100+ std::cin.tie (nullptr );
101+
102+ int t = 1 ;
103+ std::cin >> t;
104+
105+ while (t--)
106+ solve ();
107+
108+ return 0 ;
109+ }
0 commit comments