/*
* Problem :: 16938 / 캠프 준비
*
* Kind :: Bitmask
*
* Insight
* - max(N)=15
* + 2^15 = 32768 < 2*10^8
* # 가능한 조합을 다 만들어봐도 시간 제한내에 풀 수 있다
* -> 15 < 32 이니, 비트마스크로 풀어보자
*
* Point
* - 가장 어려운문제와 쉬운 문제를 편하게 알기 위해
* 난이도가 들어있는 배열 A 를 오름차순으로 정렬하였다
* + 1~i 번째 문제중 2,3,5,7 번째 문제를 뽑았다면
* 2번째 문제가 가장 난이도가 낮은 문제,
* 7번째 문제가 가장 난이도가 높은 문제가 된다
*
* - 문제는 1번 부터 문제가 시작하지만
* 코드에서는 편의상 0번 부터 문제가 시작되도록 하였다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
using namespace std;
#define endl '\n'
// Set up : Global Variables
int N, L, R, X;
int A[15];
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
cin >> N >> L >> R >> X;
for (int i=0; i<N; i++) {
cin >> A[i];
}
// Process
int ans = 0; /* 문제를 고르는 방법의 수 */
sort(A, A+N); /* 난이도 오름차순으로 정렬 */
for (int i=0; i<(1<<N); i++) {
int bm = i; /* 비트마스크 */
vector<int> diffs; /* 고른 문제가 저장된 Vector */
for (int j=0; j<N; j++) {
if (bm & (1<<j)) { /* 비트마스크를 이용하여 문제를 고름 */
diffs.push_back(A[j]);
}
}
if (diffs.size() >= 2) { /* 두 문제 이상이고 */
int easiest = diffs.front(); /* 가장 쉬운 문제 */
int hardest = diffs.back(); /* 가장 어려운 문제 */
if (hardest - easiest >= X) { /* 난이도 차이가 X 보다 크거나 같고 */
int sum = accumulate(diffs.begin(), diffs.end(), 0);
if (sum >= L && sum <= R) { /* 난이도 합이 L 이상 R 이하이면 */
ans++; /* 가능한 방법을 하나 찾음 */
}
}
}
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */