#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
#define reg register
#define gc getchar
inline int read() {
int res=0;char ch=gc();bool fu=0;
while(!isdigit(ch))fu|=(ch==‘-‘), ch=gc();
while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48), ch=gc();
return fu?-res:res;
}
#define N 500005
int n, k, L, R;
int a[N], sum[N];
#define pii pair<int, int>
#define mkp make_pair
priority_queue<pii> q;
int tim[N];
int cpy[N], u;
namespace seg {
int tr[N*25], ls[N*25], rs[N*25], tot, root[N];
int Insert(int o, int l, int r, int p)
{
int jd = ++tot;
tr[jd] = tr[o] + 1;
if (l == r) return jd;
ls[jd] = ls[o], rs[jd] = rs[o];
int mid = (l + r) >> 1;
if (p <= mid) ls[jd] = Insert(ls[o], l, mid, p);
else rs[jd] = Insert(rs[o], mid + 1, r, p);
return jd;
}
int K_th(int l, int r, int o1, int o2, int k)
{
if (l == r) return l;
int sum = tr[ls[o2]] - tr[ls[o1]];
int mid = (l + r) >> 1;
if (sum >= k) return K_th(l, mid, ls[o1], ls[o2], k);
else return K_th(mid + 1, r, rs[o1], rs[o2], k - sum);
}
}
int now = 1;
long long ans;
int lmx[N], rmx[N];
int main()
{
n = read(), k = read(), L = read(), R = read();
for (reg int i = 1 ; i <= n ; i ++) a[i] = read();
for (reg int i = 1 ; i <= n ; i ++) cpy[i] = sum[i] = sum[i - 1] + a[i];
sort(cpy + 1, cpy + 1 + n);
u = unique(cpy + 1, cpy + 1 + n) - cpy - 1;
for (reg int i = 1 ; i <= n ; i ++) sum[i] = lower_bound(cpy + 1, cpy + 1 + u, sum[i]) - cpy;
for (reg int i = 1 ; i <= n ; i ++) seg::root[i] = seg::Insert(seg::root[i - 1], 1, u, sum[i]);
for (reg int i = 1 ; i <= n - L + 1 ; i ++)
{
int l = min(n, i + L - 1), r = min(n, i + R - 1);
lmx[i] = l, rmx[i] = r;
tim[i] = 1;
// printf("%d %d %d\n", i, l, r);
q.push(mkp(cpy[seg::K_th(1, u, seg::root[l - 1], seg::root[r], rmx[i] - lmx[i] + 2 - tim[i])] - cpy[sum[i - 1]], i));
}
// for (int i = 1; i <= n ; i ++) printf("%d ", sum[i]);puts("");
for ( ; now <= k ; now ++)
{
pii tp = q.top();q.pop();
ans += tp.first;
tim[tp.second] ++;
// printf("%d %d\n", tp.second, tp.first);
if (tim[tp.second] > rmx[tp.second] - lmx[tp.second] + 1) continue;
int l = min(n, tp.second + L - 1), r = min(n, tp.second + R - 1);
q.push(mkp(cpy[seg::K_th(1, u, seg::root[l - 1], seg::root[r], rmx[tp.second] - lmx[tp.second] + 2 - tim[tp.second])] - cpy[sum[tp.second - 1]], tp.second));
}
cout << ans << endl;
return 0;
}