#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 7;
int n, a[NMAX], last[NMAX], root[40 * NMAX];
int first[40 * NMAX], l[40 * NMAX], r[40 * NMAX];
int Time = 0;
void update(int node, int &cur, int st, int en, int idx, int val) {
  cur = ++Time;
  l[cur] = l[node];
  r[cur] = r[node];
  first[cur] = first[node] + val;
  if (st == en) return;
  int mid = (st + en) / 2;
  if (idx <= mid)
    update(l[node], l[cur], st, mid, idx, val);
  else
    update(r[node], r[cur], mid + 1, en, idx, val);
}
int ans = 0;
void get(int node, int st, int en, int K) {
  if (st == en) {
    ans = st;
    return;
  }
  int mid = (st + en) / 2;
  if (first[l[node]] >= K)
    get(l[node], st, mid, K);
  else
    get(r[node], mid + 1, en, K - first[l[node]]);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = n; i; i--) {
    update(root[i + 1], root[i], 1, n + 1, i, 1);
    if (last[a[i]]) update(root[i], root[i], 1, n + 1, last[a[i]], -1);
    last[a[i]] = i;
  }
  for (int k = 1; k <= n; k++) {
    int res = 0;
    int i = 1;
    while (i <= n) {
      ans = 0;
      get(root[i], 1, n + 1, k + 1);
      i = ans;
      res++;
    }
    cout << res << endl;
  }
  return 0;
}
