#include <bits/stdc++.h>
using namespace std;
int tot = 0;
int lc[10000000], rc[10000000], sumv[10000000], root[100010];
int n, a[100010];
void insert(int &p, int q, int l, int r, int v) {
  p = ++tot;
  sumv[p] = sumv[q] + 1;
  if (l == r) return;
  if (v <= ((l + r) >> 1)) {
    rc[p] = rc[q];
    insert(lc[p], lc[q], l, ((l + r) >> 1), v);
  } else {
    lc[p] = lc[q];
    insert(rc[p], rc[q], ((l + r) >> 1) + 1, r, v);
  }
}
int query(int p, int l, int r, int v) {
  if (l == r && sumv[p] == v + 1) {
    return l;
  } else if (sumv[p] <= v) {
    return r + 1;
  } else if (sumv[lc[p]] <= v) {
    return query(rc[p], ((l + r) >> 1) + 1, r, v - sumv[lc[p]]);
  } else {
    return query(lc[p], l, ((l + r) >> 1), v);
  }
}
int lst[100010], rt[100010], rootn;
int find_right(int i, int sz) { return query(rt[i - 1], 1, n, i - 1 + sz) - 1; }
vector<int> vec[100010];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    vec[lst[a[i]]].push_back(i);
    lst[a[i]] = i;
  }
  for (int i = 0; i < n; i++) {
    for (auto j : vec[i]) {
      insert(root[rootn + 1], root[rootn], 1, n, j);
      rootn++;
    }
    rt[i] = root[rootn];
  }
  for (int i = 1; i <= n; i++) {
    int cnt = 0;
    for (int j = 1; j <= n;) {
      int jt = find_right(j, i);
      j = jt + 1;
      cnt++;
    }
    printf("%d ", cnt);
  }
  return 0;
}
