#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;   }   