#include using namespace std; #define modulo 1000000007 #define mod(mod_x) ((((long long)mod_x+modulo))%modulo) #define Inf 1000000000000000000 template struct SWAG{ F func; T init_value; vector> X,Y; SWAG(F f,T iv):func(f){ init_value = iv; } void push_front(T x){ if(X.empty())X.push_back({x,x}); else X.push_back({x,func(x,X.back().second)}); } void push_back(T x){ if(Y.empty())Y.push_back({x,x}); else Y.push_back({x,func(Y.back().second,x)}); } void pop_front(){ if(X.empty()){ int n = Y.size(); vector t; for(int i=0;i t; for(int i=0;i>N>>K>>M; vector A(N); for(int i=0;i>A[i]; vector S(N+1,0); for(int i=1;i<=N;i++){ S[i] = S[i-1] + A[i-1]; } auto f = [](long long a,long long b){ return max(a,b); }; vector> Sm(K+1,SWAG(f,-Inf)),Sp(K+1,SWAG(f,-Inf)); vector> dp(N+1,vector(K+1,-Inf)); dp[0][0] = 0LL; Sm[0].push_back(0LL); Sp[0].push_back(0LL); for(int i=1;i<=N;i++){ for(int j=1;j<=K;j++){ if(Sm[j-1].size()==0)continue; if(Sm[j-1].size()>M){ Sm[j-1].pop_front(); } if(Sp[j-1].size()>M){ Sp[j-1].pop_front(); } dp[i][j] = max(Sm[j-1].get() + S[i],Sp[j-1].get() - S[i]); } for(int j=1;j<=K;j++){ if(dp[i][j]<0LL)continue; Sm[j].push_back(dp[i][j]-S[i]); Sp[j].push_back(dp[i][j]+S[i]); } } cout<