
#include <bits/stdc++.h>
#define ll long long
#define sti string
#define bit(n,i) ((n>>i) &1)
#define itachi ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define maxn 300005
#define fi first
#define se second
#define int long long

using namespace std;

int dp[maxn],a[maxn];
int st[4*maxn],lazy[4*maxn];
int n,Lefttt,Rightttt;
const int INF = 4e18;

void apply(int id,int val){
    st[id] += val;
    lazy[id] += val;
}

void down(int id){
    if(lazy[id] == 0) return;
    apply(id*2,lazy[id]);
    apply(id*2+1,lazy[id]);
    lazy[id] = 0;
}

void update(int id,int l,int r,int u,int v,int val){
    if(l>r || u>v || l>v || r<u) return;
    if(u<=l && r<=v){
        apply(id,val);
        return;
    }
    int mid = (l+r)/2;
    down(id);
    update(id*2,l,mid,u,v,val);
    update(id*2+1,mid+1,r,u,v,val);
    st[id] = min(st[id*2],st[id*2+1]);
}

void build(int id,int l,int r){
    lazy[id] = 0;
    if(l==r){
        st[id] = (l==0 ? 0 : INF);
        return;
    }
    int mid = (l+r)/2;
    build(id*2,l,mid);
    build(id*2+1,mid+1,r);
    st[id] = min(st[id*2],st[id*2+1]);
}

int get(int id,int l,int r,int u,int v){
    if(l>r || u>v || l>v || r<u) return INF;
    if(u<=l && r<=v) return st[id];
    down(id);
    int mid = (l+r)/2;
    return min(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v));
}

void setval(int id,int l,int r,int pos,int val){
    if(l==r){
        st[id] = val;
        lazy[id] = 0;
        return;
    }
    int mid = (l+r)/2;
    down(id);
    if(pos<=mid) setval(id*2,l,mid,pos,val);
    else setval(id*2+1,mid+1,r,pos,val);
    st[id] = min(st[id*2],st[id*2+1]);
}

signed main(){
    itachi
    freopen("FORMAT.inp","r",stdin);
    freopen("FORMAT.out","w",stdout);
    cin>>n>>Lefttt>>Rightttt;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=0;i<=n;i++) dp[i] = INF;
    build(1,0,n);
    vector<pair<int,int>> stMax,stMin;
    for(int i=1;i<=n;i++){
        int last = i;
        while(!stMax.empty() && stMax.back().fi<=a[i]){
            int val = stMax.back().fi;
            int L = stMax.back().se;
            stMax.pop_back();
            if(L-1<=last-2) update(1,0,n,L-1,last-2,a[i]-val);
            last = L;
        }
        update(1,0,n,i-1,i-1,a[i]);
        stMax.push_back({a[i],last});
        last = i;
        while(!stMin.empty() && stMin.back().fi>a[i]){
            int val = stMin.back().fi;
            int L = stMin.back().se;
            stMin.pop_back();
            if(L-1<=last-2) update(1,0,n,L-1,last-2,val-a[i]);
            last = L;
        }
        update(1,0,n,i-1,i-1,-a[i]);
        stMin.push_back({a[i],last});
        dp[i] = INF;
        if(i - Lefttt >= 0){
            int Left = max(0LL, i - Rightttt);
            int Right = i - Lefttt;
            dp[i] = get(1,0,n,Left,Right);
            if(dp[i] >= INF/2) dp[i] = INF;
        }
        setval(1,0,n,i,dp[i]);
    }
    cout<<(dp[n]>=INF ? -1 : dp[n]);
    return 0;
}
