#include using namespace std; #define all(v) (v).begin(),(v).end() #define pb emplace_back #define rep(i, n) for(int i=0;i<(n);i++) #define foa(e, v) for(auto& e : v) #define dout(a) cout< using pqr = priority_queue, greater>; template inline bool chmax(T1 &a, T2 b) { bool compare = a < b; if(compare) a = b; return compare; } template inline bool chmin(T1 &a, T2 b) { bool compare = a > b; if(compare) a = b; return compare; } template inline T back(std::set &s) { return *s.rbegin(); } template inline T back(std::multiset &s) { return *s.rbegin(); } template inline T pop_back(std::set &s) { auto it = prev(s.end()); T val = *it; s.erase(it); return val; } template inline T pop_back(std::multiset &s) { auto it = prev(s.end()); T val = *it; s.erase(it); return val; } const int dy[8] = {-1, 0, 0, 1, 1, -1, 1, -1}; const int dx[8] = {0, -1, 1, 0, -1, -1, 1, 1}; const ll MOD7 = 1000000007, MOD998 = 998244353, INF = (3LL << 59); const int inf = 1 << 30; const char br = '\n'; template struct segtree { public: explicit segtree(int n) : segtree(vector(n, e())) {} explicit segtree(const vector& v) : _n(int(v.size())) { size = 1; while(size < _n) size *= 2; log = __builtin_ctz(size); d = vector(2 * size, e()); for(int i = 0; i < _n; i++) d[size + i] = v[i]; for(int i = size - 1; i >= 1; i--) { update(i); } } void set(int p, S x) { p += size; d[p] = x; for(int i = 1; i <= log; i++) update(p >> i); } S get(int p) const { return d[p + size]; } S prod(int l, int r) const { S sml = e(), smr = e(); l += size; r += size; while(l < r) { if(l & 1) sml = op(sml, d[l++]); if(r & 1) smr = op(d[--r], smr); l >>= 1; r >>= 1; } return op(sml, smr); } S all_prod() const { return d[1]; } template int max_right(int l, F f) { if(l == _n) return _n; l += size; S sm = e(); do { while(l % 2 == 0) l >>= 1; if(!f(op(sm, d[l]))) { while(l < size) { l = (2 * l); if(f(op(sm, d[l]))) { sm = op(sm, d[l]); l++; } } return l - size; } sm = op(sm, d[l]); l++; } while((l & -l) != l); return _n; } template int min_left(int r, F f) { if(r == 0) return 0; r += size; S sm = e(); do { r--; while(r > 1 && (r % 2)) r >>= 1; if(!f(op(d[r], sm))) { while(r < size) { r = (2 * r + 1); if(f(op(d[r], sm))) { sm = op(d[r], sm); r--; } } return r + 1 - size; } sm = op(d[r], sm); } while((r & -r) != r); return 0; } private: int _n, size, log; vector d; void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); } }; ll op(ll a, ll b) { return max(a, b); } ll e() { return -INF; } void solve() { ll n, b, c; cin >> n >> b >> c; vector a(n + 2, 0); rep(i, n) cin >> a[i]; n += 2; vector sum(n + 1, 0); rep(i, n) sum[i + 1] = sum[i] + a[i]; vector dp(n + 1, -INF); dp[0] = 0; segtree seg(dp); ll ans = -INF; for(int i = 1; i <= n; i ++) { ll num = seg.prod(max(0LL, i - c), i) + sum[i - 1]; chmax(ans, num); seg.set(i, num - sum[i]); } cout << ans << endl; } int main() { cin.tie(0); ios::sync_with_stdio(false); int testcase = 1; // cin >> testcase; while(testcase --) solve(); return 0; }