#include <bits/stdc++.h>
using namespace std;
struct poludeque {
  int n;
  vector<long long> T;
  poludeque() = default;
  poludeque(int n) : n(n) { T.resize(4 * n, -1e18); }
  void upd(int i, long long x, int v, int l, int r) {
    if (l == r) {
      T[v] = x;
      return;
    }
    auto m = (l + r) / 2;
    i <= m ? upd(i, x, 2 * v, l, m) : upd(i, x, 2 * v + 1, m + 1, r);
    T[v] = max(T[2 * v], T[2 * v + 1]);
  }
  long long get(int lq, int rq, int v, int l, int r) {
    if (r < lq || l > rq) return -1e18;
    if (lq <= l && r <= rq) return T[v];
    auto m = (l + r) / 2;
    return max(get(lq, rq, 2 * v, l, m), get(lq, rq, 2 * v + 1, m + 1, r));
  }
  void upd(int i, long long x) { upd(i, x, 1, 0, n - 1); }
  long long get(int lq, int rq) { return get(lq, rq, 1, 0, n - 1); }
};
int main() {
  cin.tie(nullptr);
  std::ios_base::sync_with_stdio(false);
  int n, k, x;
  cin >> n >> k >> x;
  vector<int> a(n + 1);
  for (int i = 0; i < n; ++i) cin >> a[i + 1];
  vector<vector<long long> > dp(n + 1, vector<long long>(x + 1, -1e18));
  vector<poludeque> first(x + 1, poludeque(n + 500));
  first[0].upd(0, 0);
  long long ans = -1;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= x; ++j) {
      dp[i][j] = max(dp[i][j], first[j - 1].get(max(0, i - k), i - 1) + a[i]);
      if (i + k > n && j == x) ans = max(ans, dp[i][j]);
    }
    for (int j = 0; j <= x; ++j) first[j].upd(i, dp[i][j]);
  }
  cout << ans << '\n';
  return 0;
}
