#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
typedef long long ll;
deque<pair<ll, int> > q;
int n, w, s;
ll a[5005];
ll f[5005][5005];
ll last =-0x3f3f3f3f3f3f3f3f ;
ll ans = -0x3f3f3f3f3f3f3f3f;
ll maxx = -0x3f3f3f3f3f3f3f3f;
int main() {
cin >> n >> w >> s;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= 5004; i++) {
for (int j = 0; j <= 5004; j++) {
f[i][j] = -0x3f3f3f3f3f3f3f3f;
}
}
for (int i = 1; i <= n; i++) {
q.clear();
for (int j = 0; j <= s; j++) {
while (!q.empty() && q.back().first <= f[i - 1][j]) q.pop_back();
q.push_back(make_pair(f[i - 1][j], j));
//while (!q.empty() && q.front().second <= j - s) q.pop_front();
}
f[i][1] = a[i] + q.front().first;
if (i == n) ans = max(ans, f[i][1]);
for (int j = 2; j <= min(w, i); j++) {
while (!q.empty() && q.back().first <= f[i - 1][s + j - 1]) q.pop_back();
q.push_back(make_pair(f[i - 1][s + j - 1], s + j - 1));
while (!q.empty() && q.front().second <= j - 2) q.pop_front();
f[i][j] = max(f[i][j], a[i] * j + q.front().first);
if (i == n) ans = max(ans, f[i][j]);
}
}
cout << ans;
return 0;
}
只有55分,WA了