#include #include using namespace std; #include #include template struct lazysegtree{ int n; const T defvalue=(long)-1e18,lazydefvalue=0L; vectordat,lazy; lazysegtree(int n_=0) { n=1; while(n&v) { for(int i=0;i=0;i--)dat[i]=max(dat[2*i+1],dat[2*i+2]); } void eval(int i,int l,int r) { if(lazy[i]) { dat[i]+=lazy[i]; if(r-l>1) { lazy[2*i+1]+=lazy[i]; lazy[2*i+2]+=lazy[i]; } lazy[i]=lazydefvalue; } } void update(int a,int b,T x,int k=0,int l=0,int r=-1)//[a,b) { if(r<0)r=n; eval(k,l,r); if(b<=l||r<=a)return; else if(a<=l&&r<=b) { lazy[k]+=x; eval(k,l,r); } else { update(a,b,x,2*k+1,l,(l+r)/2); update(a,b,x,2*k+2,(l+r)/2,r); dat[k]=max(dat[2*k+1],dat[2*k+2]); } } T query(int a,int b,int k=0,int l=0,int r=-1)//[a,b) { if(r<0)r=n; eval(k,l,r); if(b<=l||r<=a)return defvalue; else if(a<=l&&r<=b)return dat[k]; else return max( query(a,b,2*k+1,l,(l+r)/2), query(a,b,2*k+2,(l+r)/2,r) ); } }; int N,K,M; int A[3030]; long dp[3030][3030]; main() { cin>>N>>K>>M; for(int i=0;i>A[i]; for(int i=1;i<=N;i++)dp[0][i]=-1e18; for(int i=0;iinit(N+1); for(int j=0;j<=N;j++) { init[j]=dp[i][j]; dp[i+1][j]=-1e18; } { lazysegtreeP(N+1); P.copy(init); for(int j=1;j<=N;j++) { P.update(j-M,j,A[j-1]); dp[i+1][j]=max(dp[i+1][j],P.query(j-M,j)); } } { lazysegtreeP(N+1); P.copy(init); for(int j=1;j<=N;j++) { P.update(j-M,j,-A[j-1]); dp[i+1][j]=max(dp[i+1][j],P.query(j-M,j)); } } } cout<