#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll lg[2000001],dp[2000004][40],num[2000004][40];
struct node{
ll lid,rid,num,w;
ll data;
bool operator < (node i) const{
return data<i.data;
}
};
priority_queue<node> h;
ll ans;
ll c[5000004];
ll n,k,x,y,l,r;
void add(ll s,ll l,ll r,ll posi){
node op;
op.data=c[posi]-c[s-1];
op.lid=l;
op.rid=r;
op.w=posi;
op.num=s;
h.push(op);
return ;
}
void st_work(){
lg[0]=-1;
for(int i=1;i<=n;i++){
scanf("%lld",&c[i]);
lg[i]=lg[i>>1]+1;
c[i]=c[i]+c[i-1];
dp[i][0]=c[i];
num[i][0]=i;
}
for(int j=1;j<=lg[n];j++)
for(int i=1;i<=n+1-(1<<j);i++){
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
if(dp[i][j]==dp[i][j-1])
num[i][j]=num[i][j-1];
else
num[i][j]=num[i+1<<(j-1)][j-1];
}
}
ll st_find(ll x,ll y){
int l=lg[y-x+1];
return max(dp[x][l],dp[y-(1<<l)+1][l]);
}
ll pos(ll x,ll y){
ll sj;
int l=lg[y-x+1];
if(st_find(x,y)==dp[x][l])
sj=num[x][l];
else
sj=num[y-(1<<l)+1][l];
return sj;
}
int main(){
scanf("%d%d%d%d",&n,&k,&l,&r);
st_work();
for(int i=1;i+l-1<=n;i++)
add(i,i+l-1,min(i+r-1,n),pos(i+l-1,min(i+r-1,n)));
while(k--){
int isum,inum,il,ir,imid;
il=h.top().lid;
ir=h.top().rid;
inum=h.top().num;
imid=h.top().w;
isum=h.top().data;
ans+=isum;
h.pop();
if(imid>il)
add(inum,il,imid-1,pos(il,imid-1));
if(imid<ir)
add(inum,imid+1,ir,pos(imid+1,ir));
}
printf("%lld",ans);
return 0;
}