#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class UnionFind { std::vector vec; public: UnionFind(int size) : vec(size, -1) {}; int find(int a) { return vec[a] < 0 ? a : vec[a] = find(vec[a]); } int size_of(int a) { return -vec[find(a)]; } void unite(int a, int b) { a = find(a); b = find(b); if (a == b) return; if (vec[a] > vec[b]) std::swap(a, b); vec[a] += vec[b]; vec[b] = a; } }; int main() { int n, a, b; std::cin >> n >> a >> b; std::vector stations(n); for (auto& s : stations) std::cin >> s; int right = 0; UnionFind uft(n); for (auto i = 0; i < n; ++i) { const auto s = stations[i]; const auto begin = std::distance(stations.begin(), std::lower_bound(stations.begin(), stations.end(), s + a)); const auto end = std::distance(stations.begin(), std::upper_bound(stations.begin(), stations.end(), s + b)); if (begin < right) { uft.unite(i, begin); } else { right = begin; } while (right < end) { uft.unite(i, right++); } } for (auto i = 0; i < n; ++i) { std::cout << uft.size_of(i) << '\n'; } }