#include using namespace std; using lint = long long int; using P = pair; using PL = pair; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i=i##_begin_;i--) #define REP(i, n) FOR(i,0,n) #define IREP(i, n) IFOR(i,0,n) #define ALL(a) (a).begin(),(a).end() constexpr int MOD = 1000000007; constexpr lint B1 = 1532834020; constexpr lint M1 = 2147482409; constexpr lint B2 = 1388622299; constexpr lint M2 = 2147478017; constexpr int INF = 2147483647; void yes(bool expr) {cout << (expr ? "Yes" : "No") << "\n";} struct UnionFind { vector par; UnionFind(int N) : par(N) {REP(i, N) par[i] = i;} int root(int x) { if (par[x] == x) return x; return par[x] = root(par[x]); } void unite(int x, int y) { int rx = root(x); int ry = root(y); if (rx == ry) return; par[rx] = ry; } bool same(int x, int y) {return root(x) == root(y);} }; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); lint N, A, B; cin >> N >> A >> B; vector x(N); REP(i, N) cin >> x[i]; UnionFind uf(N); REP(i, N) { lint l = -1; lint r = N; while(r-l > 1) { lint m = (l+r) / 2; if(x[m] <= x[i] + B) l = m; else r = m; } lint bp = l; l = -1; r = N; while(r-l > 1) { lint m = (l+r) / 2; if(x[m] < x[i] + A) l = m; else r = m; } lint ap = l; IFOR(j, ap+1, bp+1) { if(uf.same(i, j)) break; uf.unite(i, j); } } vector size(N); REP(i, N) uf.root(i); REP(i, N) size[uf.par[i]]++; REP(i, N) cout << size[uf.root(i)] << "\n"; }