#include #include typedef struct { int *par, *size, *height; } UF_forest; void UF_initialize(UF_forest *F, int n) { int i; F->par = (int*)malloc(sizeof(int) * (n + 1)); F->size = (int*)malloc(sizeof(int) * (n + 1)); F->height = (int*)malloc(sizeof(int) * (n + 1)); for (i = 1; i <= n; i++) { F->par[i] = i; F->size[i] = 1; F->height[i] = 1; } } void UF_merge(UF_forest *F, int u, int v) { for (; F->par[u] != u; u = F->par[u]); for (; F->par[v] != v; v = F->par[v]); if (u == v) return; else if (F->height[u] > F->height[v]) { F->par[v] = u; F->size[u] += F->size[v]; } else { F->par[u] = v; F->size[v] += F->size[u]; if (F->height[u] == F->height[v]) F->height[v]++; } } int UF_root(UF_forest *F, int v) { for (; F->par[v] != v; v = F->par[v]); return v; } int UF_size(UF_forest *F, int v) { for (; F->par[v] != v; v = F->par[v]); return F->size[v]; } int main() { int i, N, A, B, x[200002]; scanf("%d %d %d", &N, &A, &B); for (i = 1; i <= N; i++) scanf("%d", &(x[i])); x[0] = -(1 << 30); x[N+1] = x[N] + B + 1; int j, l[2], r[2], m, tmp = 0; UF_forest F; UF_initialize(&F, N + 1); for (i = 1; i <= N; i++) { l[0] = i; r[0] = N + 1; while (l[0] < r[0]) { m = (l[0] + r[0] + 1) / 2; if (x[m] - x[i] > B) r[0] = m - 1; else l[0] = m; } l[1] = i; r[1] = N + 1; while (l[1] < r[1]) { m = (l[1] + r[1]) / 2; if (x[m] - x[i] < A) l[1] = m + 1; else r[1] = m; } for (j = (l[1] < tmp)? tmp: l[1]; j <= r[0]; j++) UF_merge(&F, i, j); tmp = r[0]; } for (i = 1; i <= N; i++) printf("%d\n", UF_size(&F, i)); fflush(stdout); return 0; }