import sys import bisect # 再帰の制限を緩和(Nが大きい場合に対応) sys.setrecursionlimit(10**6) # StationConnectivity クラスは前回と同じで問題ありません class StationConnectivity: def __init__(self, num_station): self.parent = [-1] * num_station self.max_idx = list(range(num_station)) def find(self, i): if self.parent[i] < 0: return i else: self.parent[i] = self.find(self.parent[i]) return self.parent[i] def union(self, i, j): root_i = self.find(i) root_j = self.find(j) if root_i != root_j: if self.parent[root_i] > self.parent[root_j]: root_i, root_j = root_j, root_i self.parent[root_i] += self.parent[root_j] self.parent[root_j] = root_i self.max_idx[root_i] = max(self.max_idx[root_i], self.max_idx[root_j]) def countReachable(self, i): return -self.parent[self.find(i)] def main(): try: # 入力を高速に読み込む input = sys.stdin.readline num_station, A, B = map(int, input().split()) xi = list(map(int, input().split())) except (IOError, ValueError): return railway = StationConnectivity(num_station) for i in range(num_station): start_idx = bisect.bisect_left(xi, xi[i] - B, hi=i) end_idx = bisect.bisect_right(xi, xi[i] - A, hi=i) # === ここからが修正箇所 === k = start_idx while k < end_idx: # kが属するグループの根を見つける root_k = railway.find(k) # unionする前に、次にジャンプすべき位置を確保しておく # (kが属するグループの最大インデックス + 1) next_k = railway.max_idx[root_k] + 1 # 駅iと駅kを連結する railway.union(i, k) # 事前に確保しておいた位置へジャンプする k = next_k # === ここまでが修正箇所 === for i in range(num_station): print(railway.countReachable(i)) if __name__ == "__main__": main()