#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' ', StringSplitOptions.RemoveEmptyEntries), 0); return T.Parse(_input[_iter++], null); } #endregion var n = I(); var b = Math.Min(I(), 3); var c = I(); var az = Enumerable.Range(0, n).Select(_ => I()).ToArray(); var dp = new long[n + 1]; var dp2 = new long[n + 1]; for (var lp = 0; lp < 2; lp++) { dp.AsSpan().Fill(long.MinValue / 8); var sz = new long[n + 1]; for (var i = 0; i < n; i++) sz[i + 1] = sz[i] + az[i]; for (var i = 0; i < c; i++) dp[i] = sz[i]; for (var i = 0; i < n; i++) { var v = dp[i]; for (var x = c - 2; x < c; x++) for (var y = 1; y < Math.Min(b, n - i + 1); y++) { var k = x; if (i + x + y >= n) k = n - i - y; var j = i + k + y; dp[j] = Math.Max(dp[j], v + sz[j] - sz[j - k]); } } (dp, dp2) = (dp2, dp); Array.Reverse(az); } var ans = Math.Max(dp.Max(), dp2.Max()); for (var i = 1; i <= n; i++) ans = Math.Max(ans, dp[i - 1] + dp2[n - i]); Console.WriteLine(ans);