#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define xx first
#define yy second
#define ff(i,s,f) for(ll i=s;i<f;i++)
#define fb(i,s,f) for(ll i=(s)-1;i>=f;i--)
#define ffi(i,s,f) for(ll i=s;i<=f;i++)
#define fbi(i,s,f) for(ll i=s;i>=f;i--)
#define srt(a) sort(a.begin(),a.end());
#define srtg(a,ll) sort(a.begin(),a.end(),greater<ll>())
#define lb(a,x) lower_bound(a.begin(),a.end(),x)
#define ub(a,x) upper_bound(a.begin(),a.end(),x)
#define fnd(a,x) find(a.begin(),a.end(),x)
#define vstart auto startt=chrono::system_clock::now()
#define vend auto endd=chrono::system_clock::now()
#define vvreme chrono::duration<double> vremee=endd-startt
#define ios ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)

using namespace std;

typedef long long ll;
typedef pair<ll,ll> pii;
typedef pair<ll,ll> pll;
typedef string str;

const ll maxn=2e5+10;
const ll maxa=1e5+10;

ll n,k,res=LLONG_MIN;
ll niz[maxn];
pii segt[4*2*maxa+10];
pii sortiran[maxn];

void update(ll t,ll kt,ll ind=1,ll l=0,ll r=2*maxa){
    if(l==t){
        segt[ind].xx+=kt;
        segt[ind].yy+=kt*t;
        return;
    }
    ll mid=l+(r-l)/2;
    if(t<=mid) update(t,kt,2*ind,l,mid);
    else update(t,kt,2*ind+1,mid+1,r);
    segt[ind].xx=segt[2*ind].xx+segt[2*ind+1].xx;
    segt[ind].yy=segt[2*ind].yy+segt[2*ind+1].yy;
}

ll query(ll t,ll ind=1,ll l=0,ll r=2*maxa){
    if(t==0) return 0;
    if(segt[ind].xx<=t) return segt[ind].yy;
    ll mid=l+(r-l)/2;
    ll ret=0;
    ret+=query(min(segt[2*ind+1].xx,t),2*ind+1,mid+1,r);
    ret+=query(max(0LL,k-segt[2*ind+1].xx),2*ind,l,mid+1);
    return ret;
}

void uradi(){
    if(k==1){
        for(ll i=0;i<n;i++) res=max(res,niz[i]);
        return;
    }
    ll maxlevo=LLONG_MIN;
    ll gdemaxdesno=0;
    ll maxdesno=LLONG_MIN;
    for(ll i=0;i<n;i++){
        sortiran[i].xx=-niz[i];
        sortiran[i].yy=i;
    }
    sort(sortiran,sortiran+n,greater<pii>() );
    for(ll i=0;i<4*maxn;i++) segt[i].xx=segt[i].yy=0;
    for(ll i=0;i<n;i++){
        update(-niz[i]+maxa,1);
    }
    for(ll i=0;i<n-1;i++){
        if(i==0){
            maxlevo=niz[0];
            update(-niz[i]+maxa,-1);
        }else{
            if(maxlevo<niz[i]){
                update(maxlevo+maxa,1);
                maxlevo=niz[i];
            }else{
                update(niz[i]+maxa,1);
            }
            update(-niz[i]+maxa,-1);
        }
        while(sortiran[gdemaxdesno].yy<=i){
            gdemaxdesno++;
        }
        maxdesno=sortiran[gdemaxdesno].xx;
        res=max(res,maxlevo+maxdesno+query(k-2));
    }
}

void solve(){
    cin>>n>>k;
    for(ll i=0;i<n;i++) cin>>niz[i];
	uradi();
	reverse(niz,niz+n);
	uradi();
	cout<<res;
}

int main(){
    ios;
    ll t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}