#include <bits/stdc++.h>
const int MAXN = 110000;
struct SegmentTree {
  struct Node {
    int ls, rs, val;
  } tr[MAXN << 6];
  int cnt, root[MAXN];
  void update(int& x, int y, int l, int r, int p, int k) {
    x = ++cnt;
    tr[x] = tr[y];
    tr[x].val += k;
    if (l == r) return;
    int mid = l + r >> 1;
    if (p <= mid)
      update(tr[x].ls, tr[y].ls, l, mid, p, k);
    else
      update(tr[x].rs, tr[y].rs, mid + 1, r, p, k);
  }
  int query(int x, int l, int r, int k) {
    if (l == r) return r;
    int mid = l + r >> 1;
    if (k < tr[tr[x].ls].val)
      return query(tr[x].ls, l, mid, k);
    else
      return query(tr[x].rs, mid + 1, r, k - tr[tr[x].ls].val);
  }
} sgt;
int a[MAXN], p[MAXN];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = n; i >= 1; i--) {
    sgt.update(sgt.root[i], sgt.root[i + 1], 1, n + 1, i, 1);
    if (p[a[i]]) sgt.update(sgt.root[i], sgt.root[i], 1, n + 1, p[a[i]], -1);
    p[a[i]] = i;
  }
  for (int k = 1; k <= n; k++) {
    int p = 1, ans = 0;
    while (p <= n) p = sgt.query(sgt.root[p], 1, n + 1, k), ans++;
    printf("%d ", ans);
  }
  putchar('\n');
  return 0;
}
