#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,k,ans;
int a[N],b[N],l[N],r[N];
bitset<N> vis;
struct node{
int x,f,pos;
bool friend operator < (node a,node b){
return a.x>b.x;
}
};
priority_queue<node> q;
void delet(int x,int opt){
if(opt){
b[x]=b[l[x]]+b[r[x]]-b[x];
q.push((node){-b[x],0,x});
}else{
b[x]=b[l[x]]+b[r[x]]+b[x];
q.push((node){b[x],1,x});
}
vis[l[x]]=vis[r[x]]=1;
r[l[l[x]]]=x,l[r[r[x]]]=x;
l[x]=l[l[x]],r[x]=r[r[x]];
return ;
}
int main(){
scanf("%d%d",&n,&k);int maxn;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int L=1,R=n;
for(int i=1;i<=n;i++,L++) if(a[i]>=0) break ;
for(int i=n;i>=L;i--,R--) if(a[i]>=0) break ;
int last=0;m=1;
for(int i=L;i<=R;i++){
if(a[i]>=0){ if(last<0) m++;b[m]+=a[i];}
else if(a[i]<0){ if(last>=0) m++;b[m]+=a[i];}
last=a[i];
}
int cnt=0;
for(int i=1;i<=m;i++){
l[i]=i-1,r[i]=i+1;
if(b[i]<0) q.push((node){-b[i],0,i});
else q.push((node){b[i],1,i}),cnt++,ans+=b[i];
}
r[m]=0;
while(cnt>k){
auto t=q.top();q.pop();
if(vis[t.pos]) continue ;
if(t.f==1){
ans-=t.x;
delet(t.pos,1);
}else{
ans-=t.x;
delet(t.pos,0);
}
cnt--;
}
printf("%d",ans);
return 0;
}