Problem:
Score : 700 points

Problem Statement

There are N panels arranged in a row in Takahashi's house, numbered 1 through N. The i-th panel has a number A_i written on it. Takahashi is playing by throwing balls at these panels.

Takahashi threw a ball K times. Let the panel hit by a boll in the i-th throw be panel p_i. He set the score for the i-th throw as i \times A_{p_i}.

He was about to calculate the total score for his throws, when he realized that he forgot the panels hit by balls, p_1,p_2,...,p_K. The only fact he remembers is that for every i (1 ≦ i ≦ K-1), 1 ≦ p_{i+1}-p_i ≦ M holds. Based on this fact, find the maximum possible total score for his throws.

Constraints

1 ≦ M ≦ N ≦ 100,000

1 ≦ K ≦ min(300,N)

1 ≦ A_i ≦ 10^{9}

Partial Scores

In the test set worth 100 points, M = N.

In the test set worth another 200 points, N ≦ 300 and K ≦ 30.

In the test set worth another 300 points, K ≦ 30.

Input

The input is given from Standard Input in the following format:

N M K
A_1 A_2 … A_N

Output

Print the maximum possible total score for Takahashi's throws.

Sample Input 1

5 2 3
10 2 8 10 2

Sample Output 1

56

The total score is maximized when panels 1,3 and 4 are hit, in this order.

Sample Input 2

5 5 2
5 2 10 5 9

Sample Output 2

28

This case satisfies the additional constraint M = N for a partial score.

Sample Input 3

10 3 5
3 7 2 6 9 4 8 5 1 1000000000

Sample Output 3

5000000078

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double dd;
#define i_7 (ll)(1E9+7)
//#define i_7 998244353
#define i_5 i_7-2
ll mod(ll a){
    ll c=a%i_7;
    if(c>=0)return c;
    return c+i_7;
}
typedef pair<ll,ll> l_l;
//ll inf=(ll)1E17;

#define rep(i,l,r) for(ll i=l;i<=r;i++)
#define pb push_back
ll max(ll a,ll b){if(a<b)return b;else return a;}
ll min(ll a,ll b){if(a>b)return b;else return a;}
void Max(ll &pos,ll val){pos=max(pos,val);}//Max(dp[n],dp[n-1]);
void Min(ll &pos,ll val){pos=min(pos,val);}
void Add(ll &pos,ll val){pos=mod(pos+val);}
dd EPS=1E-9;
#define fastio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
////////////////////////////////////////
ll inf=1E3;
struct RBQ{
    ll n;
    vector<ll>dat;
    RBQ(){}
    void resize(ll n_){
        n=1;while(n<n_)n*=2;
        dat.assign(2*n-1,-inf);
    }
    void update(ll k,ll x){
        k=k+n-1;
        dat[k]=x;
        while(k>0){
            k=(k-1)/2;
            dat[k]=max(dat[2*k+1],dat[2*k+2]);
        }
    }
    ll query(ll a,ll b,ll k,ll l,ll r){
        if(b<=l||r<=a)return -inf;
        if(a<=l&&r<=b)return dat[k];
        ll ml=query(a,b,2*k+1,l,(l+r)/2);
        ll mr=query(a,b,2*k+2,(l+r)/2,r);
        return max(ml,mr);
    }
    ll query(ll a,ll b){return query(a,b,0,0,n);}
};


int main(){fastio;
    ll n,m,k;cin>>n>>m>>k;
    ll a[n+1];rep(i,1,n)cin>>a[i];a[0]=0;
    RBQ u;
    u.resize(n+1);
    u.update(0,0);
    rep(i,1,k){
        for(ll j=n;j>=i;j--){
            u.update(j,u.query(max(0,j-m),j)+i*a[j]);
        }
        for(ll j=i-1;j>=0;j--){
            u.update(j,-inf);
        }
        //rep(j,0,n)cout<<u.query(j,j+1)<<" ";cout<<endl;
    }
    cout<<u.query(0,n+1)<<endl;
    return 0;
}