#include<iostream>
using namespace std;
#define endl '\n'
const int N=2e5+10;
int n,l,r;
#define lc u<<1
#define rc u<<1|1
#define mid ((l+r)>>1)
#define int long long
int w[10*N];
int tr[N*10];
int f[10*N];
void pushup(int u){
tr[u]=max(tr[lc],tr[rc]);
}
void build(int u,int l,int r){
tr[u]=w[l];
if(l==r) return;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(u);
}
int query(int u,int l,int r,int x,int y){
if(x>r||y<l){
return -1e15;
}
if(l==r){
return tr[u];
}
int now=-1e15;
if(x<=mid)now=max(now,query(lc,l,mid,x,y));
if(y>mid)now=max(now,query(rc,mid+1,r,x,y));
return now;
}
void update(int u,int l,int r,int x,int k){
if(l==r){
tr[u]=k;return;
}
if(x<=mid) update(lc,l,mid,x,k);
else update(rc,mid+1,r,x,k);
pushup(u);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>l>>r;
for(int i=0;i<=n;++i) cin>>w[i];
for(int i=1;i<=l-1;++i) w[i]=-1e15;
build(1,0,n+r);
for(int i=1;i<=n+r;++i){
f[i]=w[i]+query(1,0,n+r,i-r,i-l);
update(1,0,n+r,i,f[i]);
}
int ans=-1e15;
for(int i=n+1;i<=n+r;++i) ans=max(ans,f[i]);
cout<<ans<<endl;
return 0;
}