/*
考虑从第一位开始递推处理
在第i位的时候,需要在i-k位(取i-k+1到i)到i(不取i)中找一个点不取
设这个点为j,这一段连续的就是j+1到i
那么f[i] = max{f[j-1] + sum[j+1, i]} (i-k<=j<=i)
运用前缀和简化一下就是f[i] = max{f[j-1]-sum[j]+sum[i]}+f[i];
发现max里面的值只与j有关,所以可以用单调队列优化转移。
*/
#include<iostream>
#include<cstdio>
#define LL long long
#define maxn 100010
using namespace std;
LL n,k,a[maxn],s[maxn],f[maxn];
LL head,tail=1,d[maxn],q[maxn];
LL que(LL j)
{
d[j]=f[j-1]-s[j];
while(head<=tail&&d[q[tail]]<d[j]) tail--;
q[++tail]=j;
while(head<=tail&&q[head]<j-k) head++;
return d[q[head]];
}
int main()
{
scanf("%lld%lld",&n,&k);
for(LL i=1;i<=n;i++)
scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];
for(LL i=1;i<=n;i++)
{
LL t=-10000000000;
f[i]=que(i)+s[i];
}
cout<<f[n];
return 0;
}