#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n, k, l, r, sum[N], lg[N], dp[N][20], pos[N][20];
struct node
{
int st, ed, lt, rt, val;
bool operator<(const node &b)const
{
return val<b.val;
}
};
priority_queue<node> q;
void init()
{
for(int j=1;j<=lg[n];j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
if(dp[i][j-1]>dp[i+(1<<(j-1))][j-1])
{
dp[i][j]=dp[i][j-1];
pos[i][j]=pos[i][j-1];
}
else
{
dp[i][j]=dp[i+(1<<(j-1))][j-1];
pos[i][j]=pos[i+(1<<(j-1))][j-1];
}
}
}
return ;
}
int query(int lt, int rt)
{
int t, tmp=lg[r-l+1];
if(dp[lt][tmp]>dp[rt-(1<<tmp)+1][tmp])
{
t=pos[lt][tmp];
}
else
{
t=pos[rt-(1<<tmp)+1][tmp];
}
return t;
}
void makenode(int st, int ed, int lt, int rt)
{
node tmp={st, ed, lt, rt, sum[ed]-sum[st-1]};
q.push(tmp);
}
signed main()
{
cin>>n>>k>>l>>r;
lg[0]=-1;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
sum[i]=sum[i-1]+x;
lg[i]=lg[i>>1]+1;
dp[i][0]=sum[i];
pos[i][0]=i;
}
init();
for(int i=1;i+l-1<=n;i++)
{
int t=query(i+l-1,min(n,i+r-1));
makenode(i,t,i+l-1,min(n,i+r-1));
}
int ans=0;
for(int i=1;i<=k;i++)
{
node cur=q.top();
q.pop();
ans+=cur.val;
if(cur.ed-1>=cur.lt)
{
int t=query(cur.lt,cur.ed-1);
makenode(cur.st,t,cur.lt,cur.ed-1);
}
if(cur.ed+1<=cur.rt)
{
int t=query(cur.ed+1,cur.rt);
makenode(cur.st,t,cur.ed+1,cur.rt);
}
}
cout<<ans;
}