#include #define rep(i,n) for (int i = 0; i < (n); ++i) #define chmax(a, b) a = max(a, b); #define chmin(a, b) a = min(a, b); using namespace std; using ll = long long; using P = pair; using VI = vector; using VVI = vector; class DSU { private: int *data; public: DSU(int n) { data = new int[n]; for(int i = 0; i < n; i++) { data[i] = -1; } } ~DSU() {delete[] data;} // path compression without recursion int find(int i) { int parent; int back_to = -1; for(; (parent = data[i]) >= 0; i = parent) { data[i] = back_to; back_to = i; } int root = i; while(back_to != -1) { i = back_to; back_to = data[i]; data[i] = root; } return root; } // union by size // returns 0 if union not performed // note that 'union' is reserved word int merge(int i, int j) { int ri = find(i), rj = find(j); if (ri == rj) return 0; if (data[ri] > data[rj]) { int t = ri; ri = rj; rj = t; } data[ri] += data[rj]; data[rj] = ri; return 1; } int get_size(int i) { return -data[find(i)]; } }; int main() { int n, a, b; cin >> n >> a >> b; VI x(n); rep(i, n) cin >> x[i]; DSU d(n); int l = 0, r = 0; rep(i, n) { while(l < n && x[l] - x[i] < a) l++; if (l < r) { d.merge(i, l); } else { r = l; } while(r < n && x[r] - x[i] <= b) { d.merge(i, r); r++; } } rep(i, n) { cout << d.get_size(i) << endl; } }