#include <bits/stdc++.h>
using namespace std;
void In() { freopen("in.in", "r", stdin); }
void Out() { freopen("out.out", "w", stdout); }
const int N = 2e5 + 10;
const int M = N * 36;
const int Mbit = 1e6 + 10;
const int inf = 0x3f3f3f3f;
int allc;
int root[N], last[N], a[N];
int L[M], R[M], cnt[M];
void init() {
  for (int i = 0; i < N; i++) root[i] = last[i] = 0;
  for (int i = 1; i <= allc; i++) L[i] = R[i] = cnt[i] = 0;
  allc = 0;
}
void update(int &now, int pre, int l, int r, int pos, int val) {
  now = ++allc;
  L[now] = L[pre];
  R[now] = R[pre];
  cnt[now] = cnt[pre] + val;
  if (l == r) return;
  int mid = l + r >> 1;
  if (pos <= mid)
    update(L[now], L[pre], l, mid, pos, val);
  else
    update(R[now], R[pre], mid + 1, r, pos, val);
}
int query(int x, int ll, int rr, int s, int t) {
  if (s <= ll && rr <= t) return cnt[x];
  int mid = ll + rr >> 1, res = 0;
  if (s <= mid) res += query(L[x], ll, mid, s, t);
  if (t > mid) res += query(R[x], mid + 1, rr, s, t);
  return res;
}
int finds(int x, int ll, int rr, int k) {
  if (ll == rr) return ll;
  int mid = ll + rr >> 1;
  if (cnt[L[x]] >= k)
    return finds(L[x], ll, mid, k);
  else
    return finds(R[x], mid + 1, rr, k - cnt[L[x]]);
}
int ans[N];
int main() {
  int T, kase = 0, n, q, x;
  init();
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = n; i >= 1; --i) {
    update(x, root[i + 1], 1, n, i, 1);
    if (last[a[i]])
      update(root[i], x, 1, n, last[a[i]], -1);
    else
      root[i] = x;
    last[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int now = 1, num = 0;
    while (now <= n) {
      int tmp;
      if (cnt[root[now]] <= i)
        tmp = n;
      else
        tmp = finds(root[now], 1, n, i + 1) - 1;
      num++;
      now = tmp + 1;
    }
    ans[i] = num;
  }
  for (int i = 1; i < n; i++) printf("%d ", ans[i]);
  printf("%d\n", ans[n]);
  return 0;
}
