#include <bits/stdc++.h>
using namespace std;
const int MN = 401010;
int last[MN], p, qz[30 * MN], ls[30 * MN], rs[30 * MN], t[MN], cnt;
void build(int &p, int l, int r) {
  p = ++cnt;
  if (l == r) return;
  build(ls[p], l, (l + r) / 2);
  build(rs[p], (l + r) / 2 + 1, r);
}
void upd(int p) { qz[p] = qz[ls[p]] + qz[rs[p]]; }
void del(int &p, int recen, int l, int r, int pos) {
  p = ++cnt;
  if (l == r) {
    qz[p] = 0;
    return;
  }
  ls[p] = ls[recen];
  rs[p] = rs[recen];
  if (pos > (l + r) / 2)
    del(rs[p], rs[recen], (l + r) / 2 + 1, r, pos);
  else
    del(ls[p], ls[recen], l, (l + r) / 2, pos);
  upd(p);
}
void add(int &p, int recen, int l, int r, int pos) {
  p = ++cnt;
  ls[p] = ls[recen];
  rs[p] = rs[recen];
  if (l == r) {
    qz[p] = 1;
    return;
  }
  if (pos > (l + r) / 2)
    add(rs[p], rs[recen], (l + r) / 2 + 1, r, pos);
  else
    add(ls[p], ls[recen], l, (l + r) / 2, pos);
  upd(p);
}
int find(int p, int l, int r, int si) {
  if (l == r && si != 1)
    return -1;
  else if (l == r)
    return l;
  if (qz[rs[p]] >= si) return find(rs[p], (l + r) / 2 + 1, r, si);
  return find(ls[p], l, (l + r) / 2, si - qz[rs[p]]);
}
int main() {
  int n;
  cin >> n;
  build(t[0], 1, n);
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    if (last[x])
      del(t[i], t[i - 1], 1, n, last[x]);
    else
      t[i] = ++cnt, ls[t[i]] = ls[t[i - 1]], rs[t[i]] = rs[t[i - 1]];
    add(t[i], t[i], 1, n, i);
    last[x] = i;
  }
  for (int i = 1; i <= n; i++) {
    int ans = 0, pr = n;
    while (pr > 0) {
      if (qz[t[pr]] <= i) {
        ans++;
        break;
      }
      pr = find(t[pr], 1, n, i + 1);
      ans++;
    }
    cout << ans << ' ';
  }
  cout << endl;
  return 0;
}
