#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 3;
const int M = 1e6 + 7;
const long long MOD = 1e9 + 7;
const long long INF = 1e18 + 9;
const int SM = 1e3 + 5;
const int logN = 20, BL = 400;
const double EPS = 3e-16;
struct Node {
  long long sum = 0, lv = 0, rv = 0;
} t[N * 22];
long long a[N], last[N], root[N], n, sz = 0;
long long build(long long tl, long long tr) {
  long long v = ++sz;
  if (tl != tr) {
    long long tm = tl + tr >> 1;
    t[v].lv = build(tl, tm);
    t[v].rv = build(tm + 1, tr);
  }
  return v;
}
long long modify(long long v, long long tl, long long tr, long long pos,
                 long long val) {
  long long nv = ++sz;
  t[nv] = t[v];
  t[nv].sum += val;
  if (tl == tr)
    return nv;
  else {
    long long tm = tl + tr >> 1;
    if (pos <= tm)
      t[nv].lv = modify(t[v].lv, tl, tm, pos, val);
    else
      t[nv].rv = modify(t[v].rv, tm + 1, tr, pos, val);
  }
  return nv;
}
long long get(long long v, long long tl, long long tr, long long k) {
  if (tl == tr)
    return tl;
  else {
    long long tm = tl + tr >> 1;
    long long cnt = t[t[v].lv].sum;
    if (cnt >= k)
      return get(t[v].lv, tl, tm, k);
    else
      return get(t[v].rv, tm + 1, tr, k - cnt);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  cin >> n;
  for (long long i = 1; i <= n; i++) {
    cin >> a[i];
  }
  root[n + 1] = build(1, n);
  for (long long i = n; i >= 1; i--) {
    root[i] = root[i + 1];
    if (last[a[i]] >= 1) root[i] = modify(root[i], 1, n, last[a[i]], -1);
    last[a[i]] = i;
    root[i] = modify(root[i], 1, n, i, 1);
  }
  for (long long i = 1; i <= n; i++) {
    long long l = 1, cnt = 0;
    while (l <= n) {
      cnt++;
      if (t[root[l]].sum < i + 1) break;
      long long r = get(root[l], 1, n, i + 1) - 1;
      l = r + 1;
    }
    cout << cnt << " ";
  }
  return 0;
}
