// #include #include using namespace std; using namespace atcoder; using ll = long long; #define rep(i, n) for (int i=0; i<(int)(n); ++(i)) #define rep3(i, m, n) for (int i=(m); (i)<(int)(n); ++(i)) #define repr(i, n) for (int i=(int)(n)-1; (i)>=0; --(i)) #define rep3r(i, m, n) for (int i=(int)(n)-1; (i)>=(int)(m); --(i)) #define all(x) (x).begin(), (x).end() const ll LINF = (ll)(1e18); ll op(ll a, ll b) { return max(a, b); } ll e() { return -LINF; } ll mapping(ll f, ll x) { return x + f; } ll composition(ll f, ll g) { return f + g; } ll id() { return 0LL; } int main() { int n, k; cin >> n >> k; vector a(n); rep(i, n) cin >> a[i]; vector sum(n+1); rep(i, n) sum[i+1] = sum[i] + a[i]; vector dp(n+1); lazy_segtree st(n+1); ll res = -LINF; dp[0] = 0; res = max(res, dp[0]); st.set(0, dp[0]); rep(i, n) { int li0 = max(0, (i+1)-(k-1)), li1 = max(0, (i+1)-k); dp[i+1] = st.prod(li1, i+1); res = max(res, st.prod(li0,i+1)+a[i]); st.apply(li0, i+1, a[i]); st.set(i+1, dp[i+1]); } res = max(res, dp[n]); cout << res << endl; return 0; }