#include <bits/stdc++.h>
using namespace std;
int main() {
long long L; int S, T, M;
cin >> L;
cin >> S >> T >> M;
vector<long long> a(M);
for (int i = 0; i < M; ++i) cin >> a[i];
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
// 特例:固定步长
if (S == T) {
int cnt = 0;
for (auto x : a) if (0 < x && x < L && x % S == 0) ++cnt;
cout << cnt << '\n';
return 0;
}
// 构造含起终点的坐标序列
vector<long long> b; b.reserve(a.size() + 2);
b.push_back(0);
for (auto x : a) if (0 < x && x < L) b.push_back(x);
b.push_back(L);
// 坐标压缩:把空隙> T 的部分收缩为 T
vector<int> pos; pos.reserve(b.size());
pos.push_back(0);
for (size_t i = 1; i < b.size(); ++i) {
long long d = b[i] - b[i - 1];
pos.push_back(pos.back() + (int)min<long long>(d, T));
}
int N = pos.back();
vector<int> has(N + 1, 0);
for (size_t i = 1; i + 1 < b.size(); ++i) has[pos[i]] = 1;
const int INF = 1e9;
vector<int> dp(N + 1, INF);
dp[0] = 0;
// 朴素 DP(区间长度 ≤ T ≤ 10)
for (int x = 1; x <= N; ++x) {
int best = INF;
int Lwin = max(0, x - T), Rwin = x - S;
for (int k = Lwin; k <= Rwin; ++k) best = min(best, dp[k]);
if (best < INF) dp[x] = best + has[x];
}
cout << dp[N] << '\n';
return 0;
}