#include "bits/stdc++.h"
using namespace std;
deque<long long> a, Jaja;
struct Valor{
long long Izquierda, Derecha, Respuesta, Suma;
};
vector<Valor> _rbol;
Valor Neutro;
Valor operator+(const Valor& a, const Valor& b){
Valor c;
c.Izquierda = max(a.Izquierda, a.Suma + b.Izquierda);
c.Derecha = max(b.Derecha, a.Derecha + b.Suma);
c.Suma = b.Suma + a.Suma;
c.Respuesta= max(max(a.Respuesta, b.Respuesta), a.Derecha + b.Izquierda);
return c;
}
void Asignar(int p, long long v){
_rbol[p].Izquierda = max(0LL, v);
_rbol[p].Derecha = max(0LL, v);
_rbol[p].Respuesta = max(0LL, v);
_rbol[p].Suma = v;
}
void Crear(int i, int d, int p){
if(i == d){
Asignar(p, a[i]);
Jaja[i] = p;
return;
}
int P = (i + d) / 2;
Crear(i, P, p * 2);
Crear(P + 1, d, p * 2 + 1);
_rbol[p] = _rbol[p * 2] + _rbol[p * 2 + 1];
}
void Actualizar(int p, int o, long long v){
if(p == 0) return;
if(p == o) Asignar(p, v);
else _rbol[p] = _rbol[p * 2] + _rbol[p * 2 + 1];
Actualizar(p / 2, o + 22, -2222);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
Neutro.Suma = 0;
Neutro.Izquierda = 0;
Neutro.Derecha = 0;
Neutro.Respuesta = 0;
int n, k;
cin>>n>>k;
k--;
long long r = 0;
for(int i = 0; i < n; i++){
long long v;
cin>>v;
if(v == 0) continue;
if(a.empty()) a.push_back(v);
else if((a.back() / abs(a.back())) == (v / abs(v))) a.back() += v;
else a.push_back(v);
}
while(!a.empty() and a[0] < 0) a.pop_front();
while(!a.empty() and a.back() < 0) a.pop_back();
n = a.size();
if(n == 0){
cout<<0;
return 0;
}
_rbol.assign(n * 4 + 22, Neutro);
Jaja.assign(n, 0);
Crear(0, n - 1, 1);
set< pair<long long, int> > Mejores;
long long Respuesta = _rbol[1].Respuesta;
for(int i = 0; i < n; i++){
if(a[i] < 0){
Mejores.insert({-a[i], i});
Actualizar(Jaja[i], Jaja[i], 0);
if(Mejores.size() > k){
auto E = *Mejores.begin();
Actualizar(Jaja[E.second], Jaja[E.second], a[E.second]);
Mejores.erase(E);
}
}
Respuesta = max(Respuesta, _rbol[1].Respuesta);
}
cout<<Respuesta;
return 0;
}