#include #define FOR(i, a, n) for(ll i = (ll)a; i < (ll)n; i++) #define FORR(i, n) for(ll i = (ll)n - 1LL; i >= 0LL; i--) #define rep(i, n) FOR(i, 0, n) #define ALL(x) begin(x), end(x) using namespace std; using ll = long long; constexpr ll Mod = 998244353; constexpr ll mod = 1e9 + 7; constexpr ll inf = 1LL << 60; const double PI = acos(-1); template inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); } template inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); } /*-------------------------------------------*/ class UnionFind { vector par; int c; public: UnionFind(int n) : par(n, -1), c(n) {} int find(int x) { return par[x] < 0 ? x : par[x] = find(par[x]); } int size(int x) { return -par[find(x)]; } int count() const { return c; } bool same(int x, int y) { return find(x) == find(y); } bool unite(int x, int y) { if((x = find(x)) == (y = find(y))) return false; if(par[x] < par[y]) swap(x, y); par[y] += par[x]; par[x] = y; return c--; } }; ll x[200009]; int imos[200009]; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n; ll a, b; cin >> n >> a >> b; rep(i, n) cin >> x[i]; vector> vec; UnionFind uf(n); rep(i, n) { int A = lower_bound(x, x + n, x[i] - b) - x; int B = upper_bound(x, x + n, x[i] - a) - x; if(A < B) { vec.emplace_back(A, B - 1); uf.unite(i, A); } int C = lower_bound(x, x + n, x[i] + a) - x; int D = upper_bound(x, x + n, x[i] + b) - x; if(C < D) { vec.emplace_back(C, D - 1); uf.unite(i, C); } } sort(ALL(vec)); int mx = 0; for(auto [A, B] : vec) { chmax(mx, A); while(mx + 1 <= B) { uf.unite(mx, mx + 1); mx++; } } rep(i, n) cout << uf.size(i) << "\n"; return 0; }