#include <bits/stdc++.h>
using namespace std;
int n, m, tree[100005], Lson[100005 * 40], Rson[100005 * 40], Val[100005 * 40];
int g[100005], a[100005], tot;
void Insert(int &rt, int ot, int l, int r, int x, int v) {
  rt = ++tot;
  Lson[rt] = Lson[ot];
  Rson[rt] = Rson[ot];
  Val[rt] = Val[ot] + v;
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (x <= mid)
    Insert(Lson[rt], Lson[ot], l, mid, x, v);
  else
    Insert(Rson[rt], Rson[ot], mid + 1, r, x, v);
}
int query(int l, int r, int v, int p) {
  if (l == r) return l;
  int mid = (l + r) >> 1;
  int res = Val[Lson[p]];
  if (res >= v)
    return query(l, mid, v, Lson[p]);
  else
    return query(mid + 1, r, v - res, Rson[p]);
}
int main() {
  scanf("%d", &n);
  for (int i = n; i >= 1; i--) {
    scanf("%d", &a[i]);
    if (g[a[i]]) {
      int res = 0;
      Insert(res, tree[i + 1], 1, n, g[a[i]], -1);
      Insert(tree[i], res, 1, n, i, 1);
    } else
      Insert(tree[i], tree[i + 1], 1, n, i, 1);
    g[a[i]] = i;
  }
  int x, ans;
  int k = Val[tree[1]];
  for (int i = 1; i <= k - 1; i++) {
    x = 1, ans = 0;
    while (x <= n) {
      if (Val[tree[x]] <= i) {
        ans++;
        break;
      }
      ans++;
      x = query(1, n, i + 1, tree[x]);
    }
    printf("%d ", ans);
  }
  for (int i = k; i <= n; i++) printf("1 ");
  puts("");
  return 0;
}
