#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fLL;
const double PI = acos((long double)-1.0);
const double EPS = 1e-10;
const int MOD = 1e9 + 7;
template <typename T>
void cmin(T &x, T y) {
  if (y < x) x = y;
}
template <typename T>
void cmax(T &x, T y) {
  if (y > x) x = y;
}
long long qpow(long long x, long long n, long long mod = MOD) {
  if (n < 0) return 0;
  long long res = 1;
  while (n) {
    if (n & 1) res = res * x % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return res;
}
long long sq(long long x) { return x * x; }
long long read() {
  long long res = 0;
  char c = getchar();
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) {
    res = res * 10 + (c - '0');
    c = getchar();
  }
  return res;
}
int n, m, a;
long long d;
long long t[100005];
namespace Solver {
void InitOnce() { int t; }
void Read() {
  int res = scanf("%d%d%d%lld", &n, &m, &a, &d);
  if (res == -1) exit(0);
  for (int i = 1; i <= m; ++i) scanf("%lld", &t[i]);
}
int tid;
long long getnextt(long long x) {
  while (tid <= m && t[tid] <= x) ++tid;
  if (tid <= m) return t[tid];
  return 0;
}
long long getnexta(long long x) {
  long long res = (x / a + 1);
  if (res > n) return 0;
  return res * a;
}
long long fastmovea(long long &nexta, long long nextt) {
  long long k = nexta / a, per = min(n - k + 1, (1 + d / a)), res = 0;
  for (int i = 30; i >= 0; --i) {
    long long num = (1LL << i);
    if (num > n) continue;
    if (num * per > n) continue;
    if (k + num * per > n) continue;
    if ((k + num * per) * a > nextt) continue;
    k += num * per;
    nexta = k * a;
    res += num;
  }
  assert(nexta <= nextt);
  return res;
}
void Solve() {
  tid = 1;
  long long sum = 0, curtime = 0;
  long long nexta = getnexta(curtime), nextt = getnextt(curtime);
  while (1) {
    if (nextt <= nexta) {
      ++sum;
      curtime = nextt + d;
      nexta = getnexta(curtime);
      nextt = getnextt(curtime);
    } else {
      sum += fastmovea(nexta, nextt);
      ++sum;
      curtime = nexta + d;
      nexta = getnexta(curtime);
      nextt = getnextt(curtime);
    }
    if (nexta == 0 && nextt == 0) {
      printf("%lld\n", sum);
      return;
    }
    if (nexta == 0) {
      while (nextt) {
        ++sum;
        curtime = nextt + d;
        nextt = getnextt(curtime);
      }
      printf("%lld\n", sum);
      return;
    }
    if (nextt == 0) {
      long long num = (n - nexta / a + 1);
      long long per = (1 + d / a);
      sum += (num + per - 1) / per;
      printf("%lld\n", sum);
      return;
    }
  }
}
}  // namespace Solver
int main() {
  Solver::InitOnce();
  while (true) {
    Solver::Read();
    Solver::Solve();
  }
  return 0;
}
