#include <bits/stdc++.h>
using namespace std;
int n,m,t,arr[100005],pos=0,fs[50005];
int a2[100005],lt[100005],rt[100005];
bool marked[100005];
struct node {
int id;
int val;
bool operator <(const node &x) const {
return val>x.val;
}
};
priority_queue<node> q;
int main() {
scanf("%d%d",&n,&m);
if (m==0) {
printf("0");
return m;
}
for (int i=1;i<=n;i++) {
scanf("%d",&t);
if (pos%2==1 && t>0 || pos%2==0 && t<0) arr[pos]+=t;
else arr[++pos]=t;
}
int res=0;
for (int i=1;i<=pos;i+=2) res+=arr[i];
for (int i=1;i<=pos;i++) {
a2[i]=arr[i];
if (a2[i]<0) a2[i]=-a2[i];
lt[i]=i-1;
rt[i]=i+1;
node N;
N.id=i;
N.val=a2[i];
q.push(N);
}
while (m<(pos+1)/2) {
node N=q.top();
q.pop();
if (marked[N.id] || a2[N.id]!=N.val) continue;
res-=N.val;
m++;
marked[lt[N.id]]=1;
marked[rt[N.id]]=1;
arr[N.id]=arr[lt[N.id]]+arr[rt[N.id]]-arr[N.id];
node New;
New.id=N.id;
New.val=arr[N.id];
q.push(New);
lt[N.id]=lt[lt[N.id]];
rt[N.id]=rt[rt[N.id]];
lt[rt[N.id]]=N.id;
rt[lt[N.id]]=N.id;
}
printf("%d",res);
}