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++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>                        
#define pb push_back                            
#define mp make_pair                            
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)((x).size())
#define endl "\n"
#define jonathan ios_base::sync_with_stdio(0)
#define livingston cin.tie(0)
using namespace std;                            
                                                
void yes() {cout << "YES" << endl;}                                               
void no() {cout << "NO" << endl;}                                                        
                                                
int dx[] = {1, 0, -1, 0, -1, -1, 1, 1};         
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1}; 
 
const int INF = 1e9 + 9;
const long long LINF = 8e18 + 8;
const double EPS = 1e-9;
const long long MOD = 998244353;

void solve() {
    int n, m, k; cin >> n >> m >> k;
    long long dp[n + 1], new_dp[n + 1], window[n + 1], a[n + 1];
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        dp[i] = a[i];
    }
    for (int j = 2; j <= k; j++) {
        deque<int> q;
        for (int i = 1; i <= m; i++) {
            while (!q.empty() and dp[i] >= dp[q.back()]) {
                q.pop_back();
            }
            q.push_back(i);
        }
        for (int i = m + 1; i <= n; i++) {
            window[i - m] = dp[q.front()];
            while (!q.empty() and q.front() < i - m) {
                q.pop_front();
            }
            while (!q.empty() and dp[i] >= dp[q.back()]) {
                q.pop_back();
            }
            q.push_back(i);
        }
        window[n + 1 - m] = dp[q.front()];
        for (int i = 2; i <= n; i++) dp[i] = max(dp[i - 1], dp[i]);
        for (int i = 1; i <= n; i++) new_dp[i] = -LINF;
        for (int i = j; i <= n; i++) {
            new_dp[i] = 1ll * j * a[i];
            if (i - m < 1) new_dp[i] += dp[i - 1];
            else new_dp[i] += window[i - m];
        }
        for (int i = 1; i <= n; i++) dp[i] = new_dp[i];
    }
    long long res = 0;
    for (int i = 1; i <= n; i++) {
        res = max(res, dp[i]);
    }
    cout << res << endl;
}
 
int main() {
    jonathan; 
    livingston;
    solve();
    return 0;
}