/** * author: boutarou * created: 14.08.2020 22:28:10 **/ #include using namespace std; #define rep(i,n) for(int i = 0; i < int(n); i++) using ll = long long; using P = pair; class UnionFind { private: vectorpar; public: UnionFind(int n) { for (int i = 0; i < n; i++) par.push_back(-1); } int root(int x) { if (par[x] < 0) return x; else return par[x] = root(par[x]); } bool same(int x, int y) { return root(x) == root(y);} void unite(int x, int y) { x = root(x), y = root(y); if (x == y) return; if (par[x] > par[y]) swap(x, y); par[x] += par[y]; par[y] = x; return; } int size(int x) { return -par[root(x)];} }; int main() { ll n, a, b; cin >> n >> a >> b; vector x(n); rep(i, n) cin >> x[i]; UnionFind uf(n); vector imos(n, 0); rep(i, n) { int before = lower_bound(x.begin(), x.end(), x[i] + a) - x.begin(); int after = upper_bound(x.begin(), x.end(), x[i] + b) - x.begin() - 1; if (before <= after && (0 <= before && before <= n - 1) && (0 <= after && after <= n - 1)) { uf.unite(i, before); imos[before]++, imos[after]--; } } for (int i = 1; i <= n - 2; i++) { imos[i] += imos[i - 1]; } rep(i, n - 1) { if (imos[i] > 0) uf.unite(i, i + 1); } rep(i, n) { cout << uf.size(i) << endl; } return 0; }