#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <cmath>
#include <deque>

using namespace std;

template<typename T, typename S>
istream& operator >> (istream& is, pair<T, S>& p) {
    is >> p.first >> p.second;
    return is;
}

template<typename T>
istream& operator >> (istream& is, vector<T>& v) {
    for (auto& x : v) {
        is >> x;
    }
    return is;
}

template<typename T>
ostream& operator << (ostream& os, const vector<T>& v) {
    for (auto& x : v) {
        os << x << " ";
    }
    os << "\n";
    return os;
}

struct MaxQueue {
    deque<int64_t> q;

    int64_t max() const {
        return q.front();
    }

    void push(int64_t x) {
        while (!q.empty() && q.back() < x)
            q.pop_back();
        q.push_back(x);
    }

    void pop(int64_t x) {
        if (!q.empty() && q.front() == x)
            q.pop_front();
    }
};

int main() {
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);

#ifdef _DEBUG
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int N, M, K;
    cin >> N >> M >> K;
    vector<int64_t> A(N);
    cin >> A;
    vector<vector<int64_t>> dp(K + 1, vector<int64_t>(N + 1, 0));
    for (int64_t k = 1; k <= K; ++k) {
        MaxQueue prev_M;
        if (k == 1) prev_M.push(0);
        for (int i = 0; i < N; ++i) {
            if (i >= k - 1) {
                dp[k][i + 1] = prev_M.max() + k * A[i];
            }
            prev_M.push(dp[k - 1][i + 1]);
            if (i >= M) prev_M.pop(dp[k - 1][i + 1 - M]);
        }
    }
    int64_t max_ans = dp[K][N];
    for (int i = 1; i < N; ++i) {
        if (dp[K][i] > max_ans) max_ans = dp[K][i];
    }
    cout << max_ans;
}
