class DisjointSet: def __init__(self, size): self.parent = list(range(size)) self.rank = [0]*size def find(self, x): stack = [] parent = self.parent while parent[x] != x: stack.append(x) x = parent[x] for y in stack: parent[y] = x return x def union(self, x, y): xr, yr = self.find(x), self.find(y) if self.rank[xr] > self.rank[yr]: self.parent[yr] = xr elif self.rank[xr] < self.rank[yr]: self.parent[xr] = yr elif xr != yr: self.parent[yr] = xr self.rank[xr] += 1 n,a,b = map(int,input().split()) X = list(map(int,input().split())) ds = DisjointSet(n) j = 0 for i,xi in enumerate(X): while j < n and X[j] < a+xi: j += 1 if j == n: break if X[j] <= b+xi: ds.union(i,j) while j+1 < n and X[j+1] <= b+xi: ds.union(j,j+1) j += 1 cnt = [0]*n for i in range(n): cnt[ds.find(i)] += 1 for i in range(n): print(cnt[ds.find(i)])