#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10, mod = 1e9 + 7, INF = 0x3f3f3f3f;
int a[maxn], last[maxn];
int id, rt[maxn], sum[maxn * 22], ls[maxn * 22], rs[maxn * 22];
void upd(int pre, int& now, int p, int c, int l, int r) {
  now = ++id;
  sum[now] = sum[pre] + c;
  ls[now] = ls[pre];
  rs[now] = rs[pre];
  if (l == r) return;
  int m = (l + r) >> 1;
  if (p <= m)
    upd(ls[pre], ls[now], p, c, l, m);
  else
    upd(rs[pre], rs[now], p, c, m + 1, r);
}
int qry(int now, int k, int l, int r) {
  if (l == r) return k >= sum[now] ? l : l - 1;
  int m = (l + r) >> 1;
  if (sum[ls[now]] <= k)
    return qry(rs[now], k - sum[ls[now]], m + 1, r);
  else
    return qry(ls[now], k, l, m);
}
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = n; i; --i) {
    if (last[a[i]]) {
      upd(rt[i + 1], rt[i], last[a[i]], -1, 1, n);
      upd(rt[i], rt[i], i, 1, 1, n);
    } else
      upd(rt[i + 1], rt[i], i, 1, 1, n);
    last[a[i]] = i;
  }
  for (int k = 1; k <= n; ++k) {
    int ans = 0, p = 1;
    while (p <= n) {
      int r = qry(rt[p], k, 1, n);
      p = r + 1;
      ans++;
    }
    printf("%d ", ans);
  }
  return 0;
}
