#include <bits/stdc++.h>
using namespace std;
int n, a[100005];
int tree[5000005];
int sdgidjbg[5000005];
int sdgwrjw[5000005];
int prv[100005], prv1[100005];
int cur = 2;
vector<int> b[100005];
int root[100005];
void upd(int s, int e, int i, int x) {
  if (s == e) {
    tree[i]++;
    return;
  }
  int mid = (s + e) >> 1;
  if (x >= s && x <= mid) {
    tree[cur] = tree[sdgidjbg[i]];
    sdgidjbg[cur] = sdgidjbg[sdgidjbg[i]];
    sdgwrjw[cur] = sdgwrjw[sdgidjbg[i]];
    sdgidjbg[i] = cur++;
    upd(s, mid, sdgidjbg[i], x);
  } else {
    tree[cur] = tree[sdgwrjw[i]];
    sdgidjbg[cur] = sdgidjbg[sdgwrjw[i]];
    sdgwrjw[cur] = sdgwrjw[sdgwrjw[i]];
    sdgwrjw[i] = cur++;
    upd(mid + 1, e, sdgwrjw[i], x);
  }
  tree[i] = tree[sdgidjbg[i]] + tree[sdgwrjw[i]];
}
int sumquery(int l, int r, int s, int e, int i) {
  if (s > r || e < l || l > r) return 0;
  if (s >= l && e <= r) return tree[i];
  int mid = (s + e) >> 1;
  return sumquery(l, r, s, mid, sdgidjbg[i]) +
         sumquery(l, r, mid + 1, e, sdgwrjw[i]);
}
int query(int s, int e, int i, int x) {
  if (s == e) {
    if (tree[i]) return s - 1;
    return s;
  }
  int mid = (s + e) >> 1;
  if (tree[sdgidjbg[i]] > x) return query(s, mid, sdgidjbg[i], x);
  return query(mid + 1, e, sdgwrjw[i], x - tree[sdgidjbg[i]]);
}
void build(int l, int r, int i) {
  if (l == r) {
    if (prv1[l] == 0) tree[i] = 1;
    return;
  }
  int mid = (l + r) >> 1;
  if (sdgidjbg[i] == 0) sdgidjbg[i] = cur++;
  if (sdgwrjw[i] == 0) sdgwrjw[i] = cur++;
  build(l, mid, sdgidjbg[i]);
  build(mid + 1, r, sdgwrjw[i]);
  tree[i] = tree[sdgidjbg[i]] + tree[sdgwrjw[i]];
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    prv1[i] = prv[a[i]];
    b[prv[a[i]]].push_back(i);
    prv[a[i]] = i;
  }
  build(1, n, 1);
  root[0] = 1;
  for (int i = 1; i <= n; i++) {
    root[i] = cur++;
    tree[root[i]] = tree[root[i - 1]];
    sdgidjbg[root[i]] = sdgidjbg[root[i - 1]];
    sdgwrjw[root[i]] = sdgwrjw[root[i - 1]];
    for (auto j : b[i]) upd(1, n, root[i], j);
  }
  for (int i = 1; i <= n; i++) {
    int an = 0, cur = 1;
    while (cur <= n) {
      int x = sumquery(1, cur - 1, 1, n, root[cur - 1]);
      if (sumquery(1, n, 1, n, root[cur - 1]) <= x + i)
        cur = n + 1;
      else
        cur = query(1, n, root[cur - 1], x + i) + 1;
      an++;
    }
    cout << an << " ";
  }
  cout << '\n';
  return 0;
}
