#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <cmath> #include <bitset> #include <vector> #include <map> #include <set> #include <queue> #include <deque> #include <algorithm> #include <complex> #include <unordered_map> #include <unordered_set> #include <random> #include <cassert> #include <fstream> #include <utility> #include <functional> #include <time.h> #include <stack> #include <array> #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair<int, int> P; ll dp[3030][3030]; ll a[3030]; ll s[3030]; const ll INF=1e18; int main() { int n, k, m; cin>>n>>k>>m; for(int i=0; i<n; i++){ cin>>a[i]; s[i+1]=s[i]+a[i]; } for(int i=0; i<=n; i++) for(int j=0; j<=k; j++) dp[i][0]=-INF; dp[0][0]=0; for(int j=0; j<k; j++){ vector<ll> v1(n+1), v2(n+1); for(int i=0; i<=n; i++){ v1[i]=dp[i][j]-s[i]; v2[i]=dp[i][j]+s[i]; } deque<int> deq; deq.push_back(0); for(int i=1; i<=n; i++){ while(!deq.empty() && deq.front()<i-m) deq.pop_front(); if(!deq.empty()) dp[i][j+1]=max(dp[i][j+1], v1[deq.front()]+s[i]); while(!deq.empty() && v1[deq.back()]<=v1[i]) deq.pop_back(); deq.push_back(i); } deq.clear(); deq.push_back(0); for(int i=1; i<=n; i++){ while(!deq.empty() && deq.front()<i-m) deq.pop_front(); if(!deq.empty()) dp[i][j+1]=max(dp[i][j+1], v2[deq.front()]-s[i]); while(!deq.empty() && v2[deq.back()]<=v2[i]) deq.pop_back(); deq.push_back(i); } } cout<<dp[n][k]<<endl; return 0; }