Problem:
Score : 1100 points

Problem Statement

There is a set consisting of N distinct integers. The i-th smallest element in this set is S_i. We want to divide this set into two sets, X and Y, such that:

The absolute difference of any two distinct elements in X is A or greater.

The absolute difference of any two distinct elements in Y is B or greater.

How many ways are there to perform such division, modulo 10^9 + 7? Note that one of X and Y may be empty.

Constraints

All input values are integers.

1 ≦ N ≦ 10^5

1 ≦ A , B ≦ 10^{18}

0 ≦ S_i ≦ 10^{18}(1 ≦ i ≦ N)

S_i < S_{i+1}(1 ≦ i ≦ N - 1)

Input

The input is given from Standard Input in the following format:

N A B
S_1
:
S_N

Output

Print the number of the different divisions under the conditions, modulo 10^9 + 7.

Sample Input 1

5 3 7
1
3
6
9
12

Sample Output 1

5

There are five ways to perform division:

X={1,6,9,12}, Y={3}

X={1,6,9}, Y={3,12}

X={3,6,9,12}, Y={1}

X={3,6,9}, Y={1,12}

X={3,6,12}, Y={1,9}

Sample Input 2

7 5 3
0
2
4
7
8
11
15

Sample Output 2

4

Sample Input 3

8 2 9
3
4
5
13
15
22
26
32

Sample Output 3

13

Sample Input 4

3 3 4
5
6
7

Sample Output 4

0

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll big = 1000000007ll;
ll n,m,k,x,y;

vector<ll> A;
vector<ll> D;
vector<ll> P;
vector<ll> CS;

ll DP[100001][2] = {0};

ll dp(ll i, ll p){
    if(i == n)return 1;
    if(DP[i][p] != -1){return DP[i][p];}
    ll ans = 0;
    if(p == 1 || D[i] >= x || i == 0)ans += dp(i+1,0);
    bool bort = 0;
    ll pek = P[i];
    if(i >= 1 && p == 0 && i < n-1 && P[i] != i+1){
        if(A[i+1] - A[i-1] < x)bort = 1;
    }
    //if(pek == n)bort = 1;
   if(i < n-1){ if(CS[pek] - CS[i+2] > 0)bort = 1;}
    if(bort == 0){
        if(pek == i+1){
            ans += dp(pek,1);
        }
        else{
            ans += dp(pek,0);
        }
    }
    ans %= big;
    DP[i][p] = ans;
    //cout << i << " " << p << "  -  " << ans << " , " << bort <<"  " << dp(i+1,0) << " " << dp(pek,(pek == i+1)) << "\n";
    return ans;
}

int main()
{
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);

    ll c1,c2,c3,c4,c5;
    ll a,b,c;

    cin >> n >> x >> y;
    if(x > y){
        a = x;
        x = y;
        y = a;
    }
    ll prev = 0;
    for(c1 = 0; c1 < n; c1++){
        cin >> a;
        A.push_back(a);
        D.push_back(a-prev);
        prev = a;
    }

    CS.push_back(0);
    for(c1 = 0; c1 < n; c1++){
        if(c1 == 0){
            CS.push_back(0);
        }
        else{
            CS.push_back(CS[c1] + (D[c1] < x));
        }
        DP[c1][0] = -1;
        DP[c1][1] = -1;
    }

    for(c1 = 0; c1 < n; c1++){
        ll l = c1+1;
        ll r = n;
        if(c1 == n-1 || D[l] >= y){
            P.push_back(l);
        }
        else{
            while(l < r-1){
                ll mid = (l+r)/2;
                if(A[mid] - A[c1] < y){
                    l = mid;
                }
                else{
                    r = mid;
                }
            }
            P.push_back(r);
        }

        //cout << P[c1] << " ";

    }

    cout << dp(0,1) << "\n";

    return 0;
}