#include <bits/stdc++.h>
using namespace std;
int A[100002], tr[100002], sum[100002 * 31], Lson[100002 * 31],
    Rson[100002 * 31], tot, n, mem[100002];
void Insert(int &rt, int old, int l, int r, int last, int x) {
  rt = ++tot;
  sum[rt] = sum[old] + (x != 0) - (last != 0);
  Lson[rt] = Lson[old];
  Rson[rt] = Rson[old];
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (!last) {
    if (x <= mid)
      Insert(Lson[rt], Lson[old], l, mid, last, x);
    else
      Insert(Rson[rt], Rson[old], mid + 1, r, last, x);
  } else if (!x) {
    if (last <= mid)
      Insert(Lson[rt], Lson[old], l, mid, last, x);
    else
      Insert(Rson[rt], Rson[old], mid + 1, r, last, x);
  } else if (last <= mid && x <= mid)
    Insert(Lson[rt], Lson[old], l, mid, last, x);
  else if (last > mid && x > mid)
    Insert(Rson[rt], Rson[old], mid + 1, r, last, x);
  else {
    Insert(Rson[rt], Rson[old], mid + 1, r, last, 0), last = 0;
    Insert(Lson[rt], Lson[old], l, mid, last, x);
  }
}
int query(int rt, int l, int r, int x) {
  if (sum[rt] < x) return r + 1;
  if (l == r) return l;
  int mid = (l + r) >> 1;
  if (sum[Lson[rt]] >= x) return query(Lson[rt], l, mid, x);
  return query(Rson[rt], mid + 1, r, x - sum[Lson[rt]]);
}
int Solve(int x) {
  int k = 1, ans = 0;
  while (k <= n) {
    ans++;
    k = query(tr[k], 1, n, x + 1);
  }
  return ans;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
  for (int i = n; i >= 1; i--)
    Insert(tr[i], tr[i + 1], 1, n, mem[A[i]], i), mem[A[i]] = i;
  for (int i = 1; i <= n; i++) printf("%d ", Solve(i));
  return 0;
}
