#include <bits/stdc++.h>
#include <queue>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const ll maxn=5e5+10;
struct node{
ll o;
ll l;
ll r;
ll w;
bool operator<(node b)const {
return w<b.w;
}
};
ll n,k,L,R,arr[maxn],st[22][maxn],lg2[maxn],pos[22][maxn],ans=0;
priority_queue<node>G;
pii query(ll l,ll r){
ll LOG=lg2[r-l+1];
ll p=r-(1<<LOG)+1;
if(st[LOG][l]>st[LOG][p]){
return {st[LOG][l],pos[LOG][l]};
}else return {st[LOG][p],pos[LOG][p]};
}
int main(){
lg2[1]=0;
memset(st,0,sizeof(st));
for(ll i=2;i<maxn;i++)lg2[i]=lg2[i>>1]+1;
cin>>n>>k>>L>>R;
for(ll i=1;i<=n;i++){
scanf("%lld",&arr[i]);
}
for(ll i=1;i<=n;i++){
st[0][i]=arr[i]+st[0][i-1];
pos[0][i]=i;
}
for(ll j=1;(1<<j)<=n;j++){
for(ll i=1;i+(1<<j)-1<=n;i++){
ll p=i+(1<<(j-1));
if(st[j-1][i]>st[j-1][p]){
st[j][i]=st[j-1][i];
pos[j][i]=pos[j-1][i];
}else{
st[j][i]=st[j-1][p];
pos[j][i]=st[j-1][p];
}
}
}
for(ll i=1;i<=n-L+1;i++){
G.push(node{i,i+L-1,min(i+R-1,n),query(i+L-1,min(i+R-1,n)).first-st[0][i-1]});
}
for(ll i=1;i<=k;i++){
node now=G.top();G.pop();
ans+=now.w;
ll pos=query(now.l, now.r).second;
if(pos!=now.l)G.push(node{now.o,now.l,pos-1,query(now.l,pos-1).first-st[0][now.o-1]});
if(pos!=now.r)G.push(node{now.o,pos+1,now.r,query(pos+1,now.r).first-st[0][now.o-1]});
}
printf("%lld\n",ans);
return 0;
}