n = read_line.to_i a = read_line.split.map(&.to_i) max = a.uniq.size ans = Array.new(n + 1, 1) mid = (n ** 0.5).to_i 1.upto(mid) do |i| ans[i] = solve1(a, i) end prev = mid + 1 (ans[mid] - 1).downto(1) do |i| c = solve2(a, i, max) prev.upto(c - 1) { |j| ans[j] = i + 1 } prev = c end puts ans[1..].join("\n") def solve1(a, k) used = Array.new(a.size + 1, false) g = [] of Int32 cnt = 1 a.size.times do |i| if !used[a[i]] if g.size == k cnt += 1 g.each { |v| used[v] = false } g.clear end used[a[i]] = true g << a[i] end end cnt end def solve2(a, l, max) lo = 0 hi = max used = Array.new(a.size + 1, false) while hi - lo > 1 k = (lo + hi) // 2 g = [] of Int32 cnt = 1 a.size.times do |i| if !used[a[i]] if g.size == k cnt += 1 g.each { |v| used[v] = false } g.clear end used[a[i]] = true g << a[i] end end g.each { |v| used[v] = false } if cnt <= l hi = k else lo = k end end hi end