// includes #include using namespace std; // macros #define pb emplace_back #define mk make_pair #define FOR(i, a, b) for(int i=(a);i<(b);++i) #define rep(i, n) FOR(i, 0, n) #define rrep(i, n) for(int i=((int)(n)-1);i>=0;i--) #define irep(itr, st) for(auto itr = (st).begin(); itr != (st).end(); ++itr) #define irrep(itr, st) for(auto itr = (st).rbegin(); itr != (st).rend(); ++itr) #define whole(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define bit(n) (1LL<<(n)) // functions template void unique(T& c){c.erase(std::unique(c.begin(), c.end()), c.end());} template bool chmax(T &a, const T &b){if(a < b){a = b; return 1;} return 0;} template bool chmin(T &a, const T &b){if(a > b){a = b; return 1;} return 0;} template istream &operator>>(istream &is, vector &vec){for(auto &v: vec)is >> v; return is;} template ostream &operator<<(ostream &os, const vector& vec){for(int i = 0; i < vec.size(); i++){ os << vec[i]; if(i + 1 != vec.size())os << " ";} return os;} template ostream &operator<<(ostream &os, const set& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;} template ostream &operator<<(ostream &os, const unordered_set& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;} template ostream &operator<<(ostream &os, const multiset& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;} template ostream &operator<<(ostream &os, const unordered_multiset& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;} template ostream &operator<<(ostream &os, const pair &p){os << "(" << p.first << ", " << p.second << ")"; return os;} template ostream &operator<<(ostream &os, const map &mp){for(auto itr = mp.begin(); itr != mp.end(); ++itr){ os << "(" << itr->first << ", " << itr->second << ")"; auto titr = itr; if(++titr != mp.end())os << " "; } return os;} template ostream &operator<<(ostream &os, const unordered_map &mp){for(auto itr = mp.begin(); itr != mp.end(); ++itr){ os << "(" << itr->first << ", " << itr->second << ")"; auto titr = itr; if(++titr != mp.end())os << " "; } return os;} // types using ll = long long int; using P = pair; // constants const int inf = 1e9; const ll linf = 1LL << 50; const double EPS = 1e-10; const int mod = 1000000007; const int dx[4] = {-1, 0, 1, 0}; const int dy[4] = {0, -1, 0, 1}; // io struct fast_io{ fast_io(){ios_base::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(20);} } fast_io_; template struct MergableRangeSet{ using PT = pair; set st; T mini = numeric_limits::min(); MergableRangeSet(){} // [l, r) void add(T l, T r){ if(r <= l)return; auto itr = st.lower_bound(make_pair(l, mini)); if(itr != st.begin()){ auto litr = itr; --litr; if(litr->second >= l){ if(litr->second >= r){ return; }else{ l = litr->first; st.erase(litr); } } } while(true){ if(itr != st.end()){ if(r < itr->first){ st.insert(make_pair(l, r)); return; }else { if(r <= itr->second){ r = itr->second; st.erase(itr); st.insert(make_pair(l, r)); return; } itr = st.erase(itr); } }else{ st.insert(make_pair(l, r)); return; } } } typename set::iterator begin() noexcept{ return st.begin(); } typename set::iterator end() noexcept{ return st.end(); } size_t size(){ return st.size(); } }; int main(int argc, char const* argv[]) { int n; cin >> n; ll d, t; cin >> d >> t; map> mp; rep(i, n){ ll x; cin >> x; ll key = x % d; if(key < 0)key += d; ll v = (x - key) / d; mp[key].add(v - t, v + t + 1); } ll res = 0; irep(itr, mp){ auto &mrs = itr->second; for(auto mtr = mrs.begin(); mtr != mrs.end(); ++mtr){ res += mtr->second - mtr->first; } } cout << res << endl; return 0; }