#include #include #include using namespace std; struct UnionFind{ vector parent; UnionFind(int n){ parent = vector(n, -1); } int root(int x){ if(parent[x] < 0) return x; else return parent[x] = root(parent[x]); } bool same(int x, int y){ x = root(x); y = root(y); return x == y; } int count(int x){ x = root(x); return -parent[x]; } void unite(int x, int y){ x = root(x); y = root(y); if(x == y) return; if(count(x) < count(y)){ int t = x; x = y; y = t; } parent[x] += parent[y]; parent[y] = x; } }; int main(){ int n, a, b; cin >> n >> a >> b; vector x(n); for(auto &p: x) cin >> p; UnionFind data(n); int plind = -1, prind = -1; for(int i = 0; i < n; i++){ int lind = n; int lwa = i; while(lind-lwa > 1){ int mid = (lind+lwa)/2; if(abs(x[mid]-x[i]) >= a) lind = mid; else lwa = mid; } int rind = i; int rwa = n; while(rwa-rind > 1){ int mid = (rind+rwa)/2; if(abs(x[mid]-x[i]) <= b) rind = mid; else rwa = mid; } //cerr << lind << " " << rind << " -> "; if(prind >= lind){ lind = prind; prind = rind; }else{ plind = lind; prind = rind; } cerr << lind << " " << rind << endl; for(int j = lind; j <= rind; j++) data.unite(i, j); } for(int i = 0; i < n; i++) cout << data.count(i) << endl; return 0; }