#include #include #include using std::scanf; using std::printf; using ll = long long; const int MAXN = 200000 + 10; int arr[MAXN]; int df[MAXN]; int rt[MAXN]; int uffind(int i) { if (rt[i] < 0) { return i; } return (rt[i] = uffind(rt[i])); } void ufunion(int i, int j) { i = uffind(i); j = uffind(j); if (i == j) return; if (-rt[i] < -rt[j]) { using std::swap; swap(rt[i], rt[j]); } rt[i] += rt[j]; rt[j] = i; } void add_edge(int i, int j) { ufunion(i, j); } int get_sz(int i) { return -rt[uffind(i)]; } ll readint() { long long n; scanf("%lld", &n); return n; } signed main() { int n = readint(); int a = readint(); int b = readint(); for (int i = 0; i < n; ++i) { rt[i] = -1; } for (int i = 0; i < n; ++i) { arr[i] = readint(); } int i_lft_a = 0; int i_lft_b = 0; for (int i = 0; i < n; ++i) { while (i_lft_b < i && arr[i] - arr[i_lft_b] > b) ++i_lft_b; while (i_lft_a < i && arr[i] - arr[i_lft_a] >= a) ++i_lft_a; if (i_lft_b < i_lft_a) { assert(a <= arr[i] - arr[i_lft_b] && arr[i] - arr[i_lft_b] <= b); assert(a <= arr[i] - arr[i_lft_a - 1] && arr[i] - arr[i_lft_a - 1] <= b); add_edge(i_lft_b, i); df[i_lft_b]++; df[i_lft_a - 1]--; } } int c = 0; for (int i = 0; i < n; ++i) { c += df[i]; if (c > 0) { add_edge(i, i + 1); } } c += df[n]; assert(c == 0); for (int i = 0; i < n; ++i) { int ans = get_sz(i); printf("%d\n", ans); } return 0; }