#include <bits/stdc++.h>
using namespace std;
int n;
int A[100005];
int pos[100005];
int tid;
int rt[100005];
int pre[100005];
int Ans[100005];
int Max[100005 * 60];
int Add[100005 * 60];
int Lson[100005 * 60];
int Rson[100005 * 60];
void up(int p) { Max[p] = max(Max[Lson[p]], Max[Rson[p]]); }
int build(int L, int R) {
  int now = ++tid;
  if (L == R) return now;
  int mid = (L + R) >> 1;
  Lson[now] = build(L, mid);
  Rson[now] = build(mid + 1, R);
  return now;
}
int update(int od, int L, int R, int l = 1, int r = n + 1) {
  int now = ++tid;
  Lson[now] = Lson[od];
  Rson[now] = Rson[od];
  Max[now] = Max[od];
  Add[now] = Add[od];
  if (L == l && R == r) {
    Max[now]++;
    Add[now]++;
    return now;
  }
  int mid = (l + r) >> 1;
  if (mid >= R)
    Lson[now] = update(Lson[od], L, R, l, mid);
  else if (mid < L)
    Rson[now] = update(Rson[od], L, R, mid + 1, r);
  else {
    Lson[now] = update(Lson[od], L, mid, l, mid);
    Rson[now] = update(Rson[od], mid + 1, R, mid + 1, r);
  }
  up(now);
  Max[now] += Add[now];
  return now;
}
int Find(int od, int k, int L, int R, int add = 0) {
  if (L == R) return L;
  add += Add[od];
  int mid = (L + R) >> 1;
  if (Max[Lson[od]] + add >= k)
    return Find(Lson[od], k, L, mid, add);
  else
    return Find(Rson[od], k, mid + 1, R, add);
}
int main() {
  scanf("%d", &n);
  for (int i = (1), i_end_ = (n); i <= i_end_; i++) scanf("%d", &A[i]);
  for (int i = (1), i_end_ = (n); i <= i_end_; i++) pre[i] = n + 2;
  rt[n + 1] = build(1, n + 1);
  for (int i = (n), i_end_ = (1); i >= i_end_; i--) {
    int L, R;
    L = i, R = pre[A[i]] - 1;
    rt[i] = update(rt[i + 1], L, R);
    pre[A[i]] = i;
  }
  for (int k = (1), k_end_ = (n); k <= k_end_; k++) {
    int now = 0;
    while (now != n) {
      now = Find(rt[now + 1], k + 1, 1, n + 1) - 1;
      Ans[k]++;
    }
  }
  for (int i = (1), i_end_ = (n); i <= i_end_; i++) printf("%d ", Ans[i]);
  puts("");
  return 0;
}
