from bisect import bisect_left, bisect_right class UnionFind: """Union Find 木 Args: n (int): 要素数 """ def __init__(self, n: int): # 独立した n 個のノードで初期化、根の場合は絶対値がノード数 self.n = n self._parent = [-1] * n def __str__(self): return str(self.groups()) def root(self, x: int) -> int: """根の探索 Args: x (int): ノードの index Returns: int: 根の index """ if self._parent[x] < 0: return x else: # 縮約 self._parent[x] = self.root(self._parent[x]) return self._parent[x] def unite(self, x: int, y: int) -> None: """ノードの結合 Args: x (int): ノードの index y (int): ノードの index """ px = self.root(x) py = self.root(y) if px == py: return # ノード数が多い方を px、少ない方を py if self._parent[px] > self._parent[py]: px, py = py, px # py -> px self._parent[px] += self._parent[py] self._parent[py] = px def is_same(self, x: int, y: int) -> bool: """グループ 一致判定 Args: x (int): ノードの index y (int): ノードの index Returns: bool: 一致 / 不一致 """ return self.root(x) == self.root(y) def size(self, x: int) -> int: """グループ内 ノード数 Args: x (int): ノードの index Returns: int: ノード数 """ return -self._parent[self.root(x)] def roots(self) -> int: """全ての根の index を返す Yields: int: ノードの index """ for idx, rnk in enumerate(self._parent): if rnk < 0: yield idx def sizes(self) -> int: """全ての木のサイズを返す Yields: int: 木のサイズ """ for r in self.roots(): yield self.size(r) def groups(self) -> list: """全ての木を返す Yields: list: 木の一覧 """ tmp = {} for i in range(self.n): j = self.root(i) tmp[j] = tmp.get(j, []) tmp[j].append(i) for nodes in tmp.values(): yield nodes n, a, b = map(int, input().split()) *x, = map(int, input().split()) lo = 0 uf = UnionFind(n) for i in range(n-1): xi = x[i] js = bisect_left(x, xi+a, lo=lo) je = bisect_right(x, xi+b, lo=lo) - 1 if js > je: continue for j in range(js, je+1): uf.unite(i, j) lo = je - 1 for i in range(n): print(uf.size(i))