#include <bits/stdc++.h>
using namespace std;
struct myQueue {
  stack<pair<long long, long long> > s1, s2;
  int size() { return s1.size() + s2.size(); }
  bool isEmpty() { return size() == 0; }
  long long getMax() {
    if (isEmpty()) {
      return -2e9;
    }
    if (!s1.empty() && !s2.empty()) {
      return max(s1.top().second, s2.top().second);
    }
    if (!s1.empty()) {
      return s1.top().second;
    }
    return s2.top().second;
  }
  void push(long long val) {
    if (s2.empty()) {
      s2.push({val, val});
    } else {
      s2.push({val, max(val, s2.top().second)});
    }
  }
  void pop() {
    if (s1.empty()) {
      while (!s2.empty()) {
        if (s1.empty()) {
          s1.push({s2.top().first, s2.top().first});
        } else {
          s1.push({s2.top().first, max(s2.top().first, s1.top().second)});
        }
        s2.pop();
      }
    }
    assert(!s1.empty());
    s1.pop();
  }
};
int main() {
  cin.tie(NULL);
  cout.tie(NULL);
  ios_base::sync_with_stdio(0);
  long long n, k, x;
  cin >> n >> k >> x;
  vector<int> a(n);
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  vector<myQueue> q(x + 1);
  for (long long i = 0; i < n; i++) {
    vector<long long> dp(x + 1, -2e9);
    if (i)
      for (long long j = 1; j < x + 1; j++) {
        if (i < k && j == 1) dp[j] = a[i];
        long long getMax = q[j - 1].getMax();
        if (getMax != -2e9) dp[j] = max(dp[j], getMax + 1LL * a[i]);
      }
    if (!i) dp[1] = a[0];
    for (long long j = 1; j < x + 1; j++) {
      if (q[j].size() == k) {
        q[j].pop();
      }
      q[j].push(dp[j]);
    }
  }
  long long ans = q[x].getMax();
  if (ans == -2e9) return cout << -1, 0;
  cout << ans;
  return 0;
}
