classSolution { pair<longlong, int> helper(vector<int>& nums, vector<longlong>& pre, longlong m, longlong l, longlong r,longlong cost){ int n = nums.size(); vector<longlong> dp(n + 1); vector<int> cnt(n + 1); deque<int> dq;
auto val = [&](int i) { return dp[i] - pre[i]; };
auto bad = [&](int a, int b) { longlong va = val(a); longlong vb = val(b);
if (va != vb) return va < vb; return cnt[a] <= cnt[b]; };
for (int i = l; i <= n; i++) { int add = i - l;
while (!dq.empty() andbad(dq.back(), add)) dq.pop_back(); dq.push_back(add);
while (!dq.empty() && dq.front() < i - r) dq.pop_front();
dp[i] = dp[i - 1]; cnt[i] = cnt[i - 1];
if (!dq.empty()) { longlong take = val(dq.front()) + pre[i] - cost; int takeCnt = cnt[dq.front()] + 1;
if (take > dp[i] or (take == dp[i] and takeCnt > cnt[i])) { dp[i] = take; cnt[i] = takeCnt; } } }
return {dp[n], cnt[n]}; } public: longlongmaximumSum(vector<int>& nums, int m, int l, int r){ longlong n = nums.size(), res = LLONG_MIN; vector<longlong> pre(n + 1); for (int i = 0; i < n; i++) { pre[i + 1] = pre[i] + nums[i]; } { multiset<longlong> ms; for(int i = n - l; i >= 0; i--) { ms.insert(pre[i+l]); res = max(res, *prev(end(ms)) - pre[i]); if(i + r <= n) ms.erase(ms.find(pre[i+r])); } } auto zero = helper(nums, pre, m, l, r, 0); if(!zero.second) return res; if(zero.second <= m) return zero.first; longlong le = 0, ri = 1e18; while (le <= ri) { longlong mid = le + (ri - le) / 2; auto [v, c] = helper(nums, pre, m, l, r, mid);
if (c > m) { le = mid + 1; } else { ri = mid - 1; } }