#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
struct Node {
  int ls, rs, v;
} seg[N * 40];
int root[N], sz, a[N], n;
void add(int &rt, int l, int r, int x, int t) {
  seg[++sz] = seg[rt];
  rt = sz;
  seg[rt].v += t;
  if (l == r) return;
  int m = l + r >> 1;
  if (x <= m)
    add(seg[rt].ls, l, m, x, t);
  else
    add(seg[rt].rs, m + 1, r, x, t);
}
int ask(int x, int l, int r, int k) {
  if (l == r) return l;
  int num = seg[seg[x].ls].v, m = l + r >> 1;
  if (num >= k)
    return ask(seg[x].ls, l, m, k);
  else
    return ask(seg[x].rs, m + 1, r, k - num);
}
int pre[N], ans[N];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = n; i > 0; --i) {
    if (pre[a[i]]) {
      add(root[i] = root[i + 1], 1, n, pre[a[i]], -1);
      add(root[i] = root[i], 1, n, i, 1);
    } else {
      add(root[i] = root[i + 1], 1, n, i, 1);
    }
    pre[a[i]] = i;
  }
  ans[n] = 1;
  for (int k = 1; k < n; ++k) {
    for (int i = 1; i <= n; ++i) {
      if (seg[root[i]].v <= k) {
        ++ans[k];
        break;
      }
      ++ans[k];
      i = ask(root[i], 1, n, k + 1) - 1;
    }
  }
  for (int i = 1; i <= n; ++i) printf("%d%c", ans[i], (i == n) ? '\n' : ' ');
  return 0;
}
