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++ (GCC 9.2.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
using ll = long long;
using ii = pair<int, int>;
constexpr ll MOD = 1e9+7;

template<typename T> class fenwick_tree {
private: vector<T> FT;
public:
	fenwick_tree(int N) { FT.assign(N + 2, 0); }
	void update(int x, T val) { ++x;if(x)for(; x < FT.size(); x += x & -x) (FT[x] += val + MOD) %= MOD; }
	T query(int x) { T ret = 0; ++x;if(x)for(; x > 0; x -= x & -x) (ret += FT[x] + MOD) %= MOD; return ret; }
	T query(int x, int y) { return query(y) - query(x - 1); }
};

ll S[100001];

int main() {
	ios_base::sync_with_stdio(0), cin.tie(0);

	ll N, A, B; cin >> N >> A >> B;
	for (int i = 0; i < N; ++i) cin >> S[i];
	
	fenwick_tree<ll> X(N), Y(N);
	vector<ii> ux, uy;
	X.update(0, 1), ux.emplace_back(0, 1);
	Y.update(0, 1), uy.emplace_back(0, 1);
	for (int i = 1, j = -1, k = -1; i < N; ++i) {
		while (j < N && S[i] - S[j + 1] >= B) ++j;
		int y = X.query(0, j + 1);

		while (k < N && S[i] - S[k + 1] >= A) ++k;
		int x = Y.query(0, k + 1);
		
		if (S[i] - S[i - 1] < A) {
			for (auto x : ux) X.update(x.f, -x.s);
			ux.clear();
		}
		if (S[i] - S[i - 1] < B) {
			for (auto y : uy) Y.update(y.f, -y.s);
			uy.clear();
		}

		if (y) Y.update(i, y), uy.emplace_back(i, y);
		if (x) X.update(i, x), ux.emplace_back(i, x);
	}

	cout << (X.query(0, N) + Y.query(0, N)) % MOD;
}