#include using namespace std; #define FOR(i,a,b) for(int i = (a); i <= (b); ++i) #define FORD(i,a,b) for(int i = (a); i >= (b); --i) #define RI(i,n) FOR(i,1,(n)) #define REP(i,n) FOR(i,0,(n)-1) #define mini(a,b) a=min(a,b) #define maxi(a,b) a=max(a,b) #define mp make_pair #define pb push_back #define st first #define nd second #define sz(w) (int) w.size() typedef vector vi; typedef long long ll; typedef long double ld; typedef pair pii; const int inf = 1e9 + 7; const ll infi = 1e18 + 7; const int maxN = 1e6 + 5; int n, k; int arr[maxN]; ll dp[10005][1009]; deque Q[1009]; int main() { scanf("%d%d",&n,&k); RI(i, n) { dp[i][0] = infi; scanf("%d",&arr[i]); RI(j, k) dp[i][j] = infi; } RI(j, k) Q[j].push_back(infi); RI(i, n) { RI(j, k) { //printf("Dla %d %d : ",i, j); ll x = Q[j].front(); //printf("%lld %lld\n", x, dp[max(i - k - 1, 0)][j - 1] + arr[i]); dp[i][j] = min(x, dp[max(i - k - 1, 0)][j - 1] + arr[i]); while (!Q[j].empty() && dp[i][j] <= Q[j].back()) { Q[j].pop_back(); } Q[j].push_back(dp[i][j]); } } ll ans = infi; RI(j, k) { mini(ans, dp[n][j]); } printf("%lld",ans); return 0; }