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: Wrong Answer)

/*
	  - - 
这次如果Ac我吃土 
*/ 
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#define pb push_back
#define mp make_pair
#define INF 9999999
#define LINF 9999999999999999
#define SINF "%"
#define uint unsigned int
#define msn(a,v) memset(a,v,sizeof(a))
#define ms(a) msn(a,0)
#define NONE -1
#define ll long long
#define ull unsigned ll
#define uchar unsigned char
#define sint short int
#define usint unsigned sint
#define xsize(a) sizeof(a)/1024/1024
#define fr(aaaaa,bbbbb) for(aaaaa = 1;aaaaa <= bbbbb;aaaaa++)
#define frr(aaaaa,bbbbb,ccccc) for(aaaaa = ccccc;aaaaa <= bbbbb;aaaaa++)
using namespace std;
#define MAXN 100100
#define MOD 1000000007

ll n,a,b;
ll data[MAXN];
ll dp[MAXN]; 

int main(){
	freopen("C.txt","r",stdin);
	data[0] = -1000000000000000000;
	
	scanf("%lld %lld %lld",&n,&a,&b);
	if(a > b) swap(a,b);
	for(int i = 1;i <= n;i++)
		scanf("%lld",&data[i]);
	
	for(int i = 1;i <= n-2;i++)
		if(data[i+2] - data[i] < a){
			printf("0\n");
			return 0;
		}
	ms(dp);
	dp[0] = 1;
	ll now = 0;
	ll lastpos = 0;
	for(int i = 1;i <= n;i++){
		//在 (0,i] 之间找到最小的lastpos,使data[i]和data[lastpos]不可以被同时放到Y中 
		for(;lastpos < i  &&  data[i] - data[lastpos] >= b;lastpos++){
			now = (now + dp[lastpos]) % MOD;
		}
		dp[i] = now;
		if(data[i] - data[i-1] < a){
			now = 0;
			lastpos = i-1;
		}
	}
	
	for(int i = lastpos;i <= n;i++){
		now = (now + dp[i]) % MOD;
	}
	
	printf("%lld\n",now);
	
	return 0;
}