#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;
}