#include using namespace std; #define LOCAL #pragma region Macros typedef long long ll; #define ALL(x) (x).begin(),(x).end() const long long MOD=1e9+7; // const long long MOD=998244353; const int INF=1e9; const long long IINF=1e18; const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; const char dir[4]={'D','R','U','L'}; template istream &operator>>(istream &is,vector &v){ for (T &x:v) is >> x; return is; } template ostream &operator<<(ostream &os,const vector &v){ for (int i=0;i ostream &operator<<(ostream &os,const pair &p){ cout << '(' << p.first << ',' << p.second << ')'; return os; } template ostream &operator<<(ostream &os,const map &m){ os << '{'; for (auto itr=m.begin();itr!=m.end();++itr){ os << '(' << itr->first << ',' << itr->second << ')'; if (++itr!=m.end()) os << ','; --itr; } os << '}'; return os; } template ostream &operator<<(ostream &os,const set &s){ os << '{'; for (auto itr=s.begin();itr!=s.end();++itr){ os << *itr; if (++itr!=s.end()) os << ','; --itr; } os << '}'; return os; } void debug_out(){cerr << '\n';} template void debug_out(Head&& head,Tail&&... tail){ cerr << head; if (sizeof...(Tail)>0) cerr << ", "; debug_out(move(tail)...); } #ifdef LOCAL #define debug(...) cerr << " ";\ cerr << #__VA_ARGS__ << " :[" << __LINE__ << ":" << __FUNCTION__ << "]" << '\n';\ cerr << " ";\ debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif template T gcd(T x,T y){return y!=0?gcd(y,x%y):x;} template T lcm(T x,T y){return x/gcd(x,y)*y;} template inline bool chmin(T1 &a,T2 b){ if (a>b){a=b; return true;} return false; } template inline bool chmax(T1 &a,T2 b){ if (a struct SegmentTree{ typedef function F; int n; F f; Monoid id; vector dat; SegmentTree(int n_,F f,Monoid id):f(f),id(id){init(n_);} void init(int n_){ n=1; while(n &v){ for (int i=0;i>=1) dat[k]=f(dat[k<<1|0],dat[k<<1|1]); } Monoid query(int a,int b){ if (a>=b) return id; Monoid vl=id,vr=id; for (int l=a+n,r=b+n;l>=1,r>>=1){ if (l&1) vl=f(vl,dat[l++]); if (r&1) vr=f(dat[--r],vr); } return f(vl,vr); } // most left position that meets condition "check" template int find(int a,int b,const C &check,int k,int l,int r){ if (!check(dat[k])||r<=a||b<=l) return -1; if (l+1==r) return k-n; int vl=find(a,b,check,k<<1|0,l,(l+r)>>1); if (~vl) return vl; return find(a,b,check,k<<1|1,(l+r)>>1,r); } template int find(int a,int b,const C &check){ return find(a,b,check,1,0,n); } Monoid operator[](int i){return dat[i+n];} }; template vector slide_min(const vector &v,int k){ deque deq; vector res; for (int i=0;i=v[i]) deq.pop_back(); deq.push_back(i); if (i-k+1>=0){ res.push_back(v[deq.front()]); if (deq.front()==i-k+1) deq.pop_front(); } } return res; } int main(){ cin.tie(0); ios::sync_with_stdio(false); int N,K,M; cin >> N >> K >> M; vector A(N); cin >> A; vector sum(N+1,0); for (int i=0;i> dp(N+1,vector(K+1,-IINF)) ,B(N+1,vector(K+1,-IINF)) ,C(N+1,vector(K+1,-IINF)); dp[0][0]=B[0][0]=C[0][0]=0; vector> deq1(K+1),deq2(K+1); deq1[0].emplace_back(0); deq2[0].emplace_back(0); for (int i=1;i<=N;++i){ for (int j=K-1;j>=0;--j){ if (!deq1[j].empty()) chmax(dp[i][j+1],B[deq1[j].front()][j]+sum[i]); if (!deq2[j].empty()) chmax(dp[i][j+1],C[deq2[j].front()][j]-sum[i]); B[i][j+1]=dp[i][j+1]-sum[i]; while(!deq1[j+1].empty()&&B[deq1[j+1].back()][j+1]<=B[i][j+1]) deq1[j+1].pop_back(); deq1[j+1].emplace_back(i); if (!deq1[j+1].empty()&&deq1[j+1].front()==i-M) deq1[j+1].pop_front(); C[i][j+1]=dp[i][j+1]+sum[i]; while(!deq2[j+1].empty()&&C[deq2[j+1].back()][j+1]<=C[i][j+1]) deq2[j+1].pop_back(); deq2[j+1].emplace_back(i); if (!deq2[j+1].empty()&&deq2[j+1].front()==i-M) deq2[j+1].pop_front(); } if (!deq1[0].empty()&&deq1[0].front()==i-M) deq1[0].pop_front(); if (!deq2[0].empty()&&deq2[0].front()==i-M) deq2[0].pop_front(); } cout << dp[N][K] << '\n'; }