#include <bits/stdc++.h>
using namespace std;
int gi() {
  int res = 0, fh = 1;
  char ch = getchar();
  while ((ch > '9' || ch < '0') && ch != '-') ch = getchar();
  if (ch == '-') fh = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') res = res * 10 + ch - '0', ch = getchar();
  return fh * res;
}
const int MAXN = 100010;
const int MAXK = MAXN << 6;
const int INF = 1e9;
int n, a[MAXN], p[MAXN];
int tot, rt[MAXN], val[MAXK], s[MAXK][2];
int build(int p, int k, int v, int l = 1, int r = n + 1) {
  int x = ++tot;
  val[x] = val[p] + v;
  if (l == r) return x;
  s[x][0] = s[p][0];
  s[x][1] = s[p][1];
  int m = l + r >> 1;
  if (k <= m)
    s[x][0] = build(s[p][0], k, v, l, m);
  else
    s[x][1] = build(s[p][1], k, v, m + 1, r);
  return x;
}
int query(int x, int k, int l = 1, int r = n + 1) {
  if (l == r) return l;
  int m = l + r >> 1;
  if (k <= val[s[x][0]]) return query(s[x][0], k, l, m);
  return query(s[x][1], k - val[s[x][0]], m + 1, r);
}
int main() {
  n = gi();
  for (int i = 1; i <= n; i++) a[i] = gi();
  for (int i = n; i; i--) {
    rt[i] = build(rt[i + 1], i, 1);
    if (p[a[i]]) rt[i] = build(rt[i], p[a[i]], -1);
    p[a[i]] = i;
  }
  for (int k = 1; k <= n; k++) {
    int ans = 0;
    for (int p = 1; p <= n; p = query(rt[p], k + 1)) ans++;
    printf("%d ", ans);
  }
  return 0;
}
