/**
* @param {number[]} A
* @param {number} L
* @param {number} M
* @return {number}
*/
// Lsum, sum of the last L elements
// Msum, sum of the last M elements
// Lmax, max sum of contiguous L elements before the last M elements.
// Mmax, max sum of contiguous M elements before the last L elements.
const maxSumTwoNoOverlap = function (A, L, M) {
// A 中现在储存的值为原先 A 的 前 i 项和
for (let i = 1; i < A.length; i++) {
A[i] += A[i - 1];
}
let res = A[L + M - 1], Lmax = A[L - 1], Mmax = A[M - 1];
for (let i = L + M; i < A.length; i++) {
Lmax = Math.max(Lmax, A[i - M] - A[i - L - M]);
Mmax = Math.max(Mmax, A[i - L] - A[i - L - M]);
res = Math.max(res, Math.max(Lmax + A[i] - A[i - M], Mmax + A[i] - A[i - L]));
}
return res;
};