module Main; import CPLib.IO; import CPLib.UnionFind::{create, get_group_size, unite, UnionFind}; main : IO () = ( let (n, a, b) = (*read_i, *read_i, *read_i); let xs = *read_is(n); let uf = UnionFind::create(n); let (uf, _, _) = range(0, n).fold((uf, 0, 0), |i, (uf, begin, end)| let begin1 = loop(begin, |begin| if begin >= n { n.break }; if xs.@(i) + a <= xs.@(begin) { begin.break }; (begin+1).continue ); let end1 = loop(end, |end| if end >= n { n.break }; if xs.@(i) + b < xs.@(end) { end.break }; (end+1).continue ); let uf = if i == 0 || begin1 >= end { range_step(begin1, end1, 1).fold(uf, |j, uf| uf.unite(i, j)) } else { range_step(end-1, end1, 1).fold(uf, |j, uf| uf.unite(i, j)) }; (uf, begin1, end1) ); let uf = *range(0, n).fold_m(uf, |i, ufe| let (uf, grps) = uf.get_group_size(i); grps.to_string.println;; uf.pure ); pure() );