80分WA,还有救么QAQ
using namespace std;
typedef long long ll;
int n,k;
ll a[1000006],u=0,cnt=0,ans=0;
priority_queue< pair<ll,int> >q;
bool l=true;
struct lian{
int fr,nxt;
}c[1000006];
bool b[1000006]={};
int main(){
scanf("%d%d",&n,&k);
for(int i(1);i<=n;++i){
scanf("%lld",&a[i]);
}
int p=1;
while(a[p]==0)++p;
a[p]>=0?l=true:l=false;
while(p<=n){
if(l){
while(a[p]>=0&&p<=n){
u+=a[p];++p;
}
l=false;a[++cnt]=u;u=0;
}
else{
while(a[p]<=0&&p<=n){
u+=a[p];++p;
}
l=true;a[++cnt]=u;u=0;
}
}
for(int i(1);i<=cnt;++i){
c[i].fr=i-1,c[i].nxt=i+1;
if(a[i]>0)ans+=a[i],--k,q.push(make_pair(-a[i],i));
else q.push(make_pair(a[i],i));
}
c[0].nxt=0;c[0].fr=0;c[cnt+1].fr=0;c[cnt+1].nxt=0;a[0]=a[cnt+1]=0;
while(k<0){
while(b[q.top().second])q.pop();
u=q.top().first,p=q.top().second;q.pop();
if((!c[p].fr||!c[p].nxt)&&a[p]<=0)continue;
ans+=u;++k;
a[p]+=a[c[p].nxt]+a[c[p].fr];q.push(make_pair(-abs(a[p]),p));
b[c[p].fr]=b[c[p].nxt]=true;a[c[p].fr]=a[c[p].nxt]=0;
c[p].fr=c[c[p].fr].fr;c[p].nxt=c[c[p].nxt].nxt;c[c[p].fr].nxt=p;c[c[p].nxt].fr=p;
c[0].nxt=0;c[0].fr=0;c[cnt+1].fr=0;c[cnt+1].nxt=0;
}
printf("%lld",ans);
return 0;
}