#include <bits/stdc++.h>
using namespace std;
const long long mxN = 1e5 + 10;
const long long L = 40;
long long n;
long long node = 1, rt[mxN], t[mxN * L], lc[mxN * L], rc[mxN * L];
void dup(long long &v) {
  ++node;
  lc[node] = lc[v];
  rc[node] = rc[v];
  t[node] = t[v];
  v = node;
}
void upd(long long &v, long long i, long long x, long long l = 1,
         long long r = n) {
  dup(v);
  if (l == r) {
    t[v] = x;
    return;
  }
  long long m = l + r >> 1;
  if (i <= m)
    upd(lc[v], i, x, l, m);
  else
    upd(rc[v], i, x, m + 1, r);
  t[v] = t[lc[v]] + t[rc[v]];
}
long long get(long long v, long long l, long long r, long long lo = 1,
              long long hi = n) {
  if (l > hi || r < lo) return 0;
  if (lo >= l && hi <= r) return t[v];
  long long m = lo + hi >> 1;
  return get(lc[v], l, r, lo, m) + get(rc[v], l, r, m + 1, hi);
}
long long query(long long v, long long k, long long l = 1, long long r = n) {
  if (l == r) return l;
  long long m = l + r >> 1;
  if (t[rc[v]] <= k)
    return query(lc[v], k - t[rc[v]], l, m);
  else
    return query(rc[v], k, m + 1, r);
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  long long a[n];
  vector<long long> inds[n];
  for (long long i = 0; i < n; ++i) {
    cin >> a[i];
    --a[i];
  }
  for (long long i = 0; i < n; ++i) {
    rt[i + 1] = rt[i];
    if (inds[a[i]].size()) {
      upd(rt[i + 1], inds[a[i]].back() + 1, 0);
    }
    inds[a[i]].push_back(i);
    upd(rt[i + 1], inds[a[i]].back() + 1, 1);
  }
  for (long long k = 1; k <= n; ++k) {
    long long cur = n, ret = 0;
    while (cur >= 1) {
      long long l = query(rt[cur], k);
      if (l == 1 && get(rt[cur], 1, cur) <= k) break;
      cur = l;
      ++ret;
    }
    cout << ret + 1 << "\n";
  }
}
