#include <bits/stdc++.h>
using namespace std;
const int sz = 5005;
struct pq {
  stack<pair<long long, long long>> s1, s2;
  bool empty() {
    if (s1.empty() && s2.empty()) return 1;
    return 0;
  }
  void push(long long val) {
    if (s1.empty())
      s1.push({val, val});
    else
      s1.push({val, max(val, s1.top().second)});
  }
  long long top() {
    if (s1.empty())
      return s2.top().second;
    else if (s2.empty())
      return s1.top().second;
    else
      return max(s2.top().second, s1.top().second);
  }
  void pop() {
    if (s2.empty()) {
      while (!s1.empty()) {
        if (s2.empty())
          s2.push({s1.top().first, s1.top().first});
        else
          s2.push({s1.top().first, max(s1.top().first, s2.top().second)});
        s1.pop();
      }
    }
    s2.pop();
  }
};
int n, k, x;
long long a[sz];
pq q[sz];
long long dp[2][sz], dp2[sz][sz];
void solve() {
  cin >> n >> k >> x;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 0; i < sz; i++) {
    dp[0][i] = -1;
    for (int j = 0; j < sz; j++) {
      dp2[i][j] = -1;
    }
  }
  dp[0][0] = 0;
  dp2[0][0] = 0;
  q[0].push(0);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= x; j++) {
      dp[i & 1 ^ 1][j] = -1;
      if (!q[j].empty()) {
        long long val = q[j].top();
        dp2[i + 1][j + 1] = max(dp2[i + 1][j + 1], val + a[i]);
      }
      if (i - k + 1 >= 0 && dp2[i - k + 1][j] != -1) q[j].pop();
      dp[i & 1 ^ 1][j] = dp2[i + 1][j];
      if (!q[j].empty()) {
        long long val = q[j].top();
        dp[i & 1 ^ 1][j] = max(dp[i & 1 ^ 1][j], val);
      }
      if (dp2[i + 1][j] != -1) q[j].push(dp2[i + 1][j]);
    }
  }
  cout << dp[n & 1][x];
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int q = 1;
  for (; q > 0; q--) {
    solve();
  }
}
