#include using namespace std; #define boost ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define INF 1e18 typedef long long ll; ll C[100001]; ll tree[300001]; ll tree1[300001]; ll dp1[100001]; ll dp2[100001]; void build(ll node, ll start,ll _end){ if(start==_end){ tree[node] = INF; return; } ll mid = (start+_end)>>1; build(2*node,start,mid); build(2*node+1,mid+1,_end); } void build1(ll node, ll start,ll _end){ if(start==_end){ tree1[node] = INF; return; } ll mid = (start+_end)>>1; build1(2*node,start,mid); build1(2*node+1,mid+1,_end); } void update(ll node, ll start, ll _end, ll idx){ if(start == _end && start == idx){ tree[node] = dp1[idx]; return; } ll mid = (start+_end)>>1; if(idx <= mid) update(2*node,start,mid,idx); else update(2*node+1,mid+1,_end,idx); tree[node] =min(tree[2*node],tree[2*node+1]); } void update1(ll node, ll start, ll _end, ll idx){ if(start == _end && start == idx){ tree1[node] = dp2[idx]; return; } ll mid = (start+_end)>>1; if(idx <= mid) update1(2*node,start,mid,idx); else update1(2*node+1,mid+1,_end,idx); tree1[node] =min(tree1[2*node],tree1[2*node+1]); } ll query(ll node, ll start, ll _end, ll qs, ll qe){ if(start > _end || qs > _end || start > qe) return INF; if(start >= qs && _end <= qe) return tree[node]; ll mid = (start+_end)>>1; ll a = query(2*node,start,mid,qs,qe); ll b = query(2*node+1,mid+1,_end,qs,qe); return min(a,b); } ll query1(ll node, ll start, ll _end, ll qs, ll qe){ if(start > _end || qs > _end || start > qe) return INF; if(start >= qs && _end <= qe) return tree1[node]; ll mid = (start+_end)>>1; ll a = query1(2*node,start,mid,qs,qe); ll b = query1(2*node+1,mid+1,_end,qs,qe); return min(a,b); } int main(){ boost; ll T,N,i,j,k,M,m,n; ll K; cin >> N >> K; for(i = 0 ; i < N ; i++) cin >> C[i]; build(1,0,N-1); build1(1,0,N-1); for(i = 0 ; i <= K && i < N; i++){ dp1[i] = C[i]; update(1,0,N-1,i); } for(i = K+1 ; i < N ; i++){ dp1[i] = C[i] + query(1,0,N-1,i-K,i-1); } for(i = N-1 ; i >= N-K-1 && i >= 0 ; i--){ dp2[i] = C[i]; update1(1,0,N-1,i); } for(i = N-K-2 ; i >= 0 ; i--){ dp2[i] = C[i] + query1(1,0,N-1,i+1,i+K); } ll _min = INF; /* for(i = 0 ; i < N ; i++) cout << dp1[i]<<" "; cout << endl; for(i = 0 ; i < N ; i++) cout << dp2[i] <<" "; cout << endl;*/ for(i = 0 ; i < N ; i++) _min = min(_min,dp1[i]+dp2[i]-C[i]); cout << _min << endl; }