#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct node {
  int l, r, sum;
} hjt[maxn * 40];
int a[maxn], root[maxn], cnt;
int last[maxn];
void insert(int l, int r, int pre, int &now, int p, int v) {
  hjt[++cnt] = hjt[pre];
  now = cnt;
  hjt[now].sum = hjt[pre].sum + v;
  if (l == r) return;
  int m = (l + r) >> 1;
  if (p <= m)
    insert(l, m, hjt[pre].l, hjt[now].l, p, v);
  else
    insert(m + 1, r, hjt[pre].r, hjt[now].r, p, v);
}
int query(int now, int l, int r, int k) {
  if (l == r) {
    if (hjt[now].sum <= k) return l;
    return l - 1;
  }
  int mid = (l + r) >> 1;
  int tmp = hjt[hjt[now].l].sum;
  if (tmp > k)
    return query(hjt[now].l, l, mid, k);
  else
    return query(hjt[now].r, mid + 1, r, k - tmp);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = n; i >= 1; i--) {
    if (last[a[i]]) {
      insert(1, n, root[i + 1], root[i], last[a[i]], -1);
      insert(1, n, root[i], root[i], i, 1);
    } else
      insert(1, n, root[i + 1], root[i], i, 1);
    last[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int ans = 0, l = 1, r = 0;
    while (l <= n) {
      r = query(root[l], 1, n, i);
      l = r + 1;
      ans++;
    }
    cout << ans;
    if (i == n)
      cout << '\n';
    else
      cout << ' ';
  }
  return 0;
}
