#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, a[100005], rt[100005], lc[10000005], rc[10000005], s[10000005],
    lst[100005], cnt;
int nwnd(int x) {
  cnt++;
  lc[cnt] = lc[x];
  rc[cnt] = rc[x];
  s[cnt] = s[x];
  return cnt;
}
void update(int &x, int l, int r, int y, int c) {
  x = nwnd(x);
  s[x] += c;
  if (l == r) return;
  int mid = (l + r) / 2;
  if (y <= mid) update(lc[x], l, mid, y, c);
  if (y > mid) update(rc[x], mid + 1, r, y, c);
}
int query(int x, int l, int r, int y) {
  if (l == r) {
    if (y > s[x]) return l + 1;
    return l;
  }
  int mid = (l + r) / 2;
  if (s[lc[x]] >= y) {
    return query(lc[x], l, mid, y);
  }
  return query(rc[x], mid + 1, r, y - s[lc[x]]);
}
int main() {
  scanf("%d", &n);
  for ((i) = 1; (i) <= (n); (i)++) {
    scanf("%d", &a[i]);
  }
  for (i = n; i >= 1; i--) {
    rt[i] = rt[i + 1];
    update(rt[i], 1, n, i, 1);
    if (lst[a[i]]) update(rt[i], 1, n, lst[a[i]], -1);
    lst[a[i]] = i;
  }
  for ((i) = 1; (i) <= (n); (i)++) {
    int x = 1, s = 0;
    while (x <= n) {
      x = query(rt[x], 1, n, i + 1);
      s++;
    }
    printf("%d ", s);
  }
  return 0;
}
