#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, M = 1e7;
int n, x, a[N], last[N], t[M], l[M], r[M], rt[N], sz;
inline int vcopy(int v) {
  ++sz;
  t[sz] = t[v];
  l[sz] = l[v];
  r[sz] = r[v];
  return sz;
}
void update(int v, int l, int r, int pos, int val) {
  if (l == r) {
    t[v] = val;
    return;
  }
  int mid = (r + l) >> 1;
  if (pos <= mid) {
    ::l[v] = vcopy(::l[v]);
    update(::l[v], l, mid, pos, val);
  } else {
    ::r[v] = vcopy(::r[v]);
    update(::r[v], mid + 1, r, pos, val);
  }
  t[v] = t[::l[v]] + t[::r[v]];
}
int get(int v, int l, int r, int x) {
  if (l == r) {
    return l;
  }
  int mid = (r + l) >> 1;
  if (x < t[::l[v]]) {
    return get(::l[v], l, mid, x);
  } else {
    return get(::r[v], mid + 1, r, x - t[::l[v]]);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (int i = n; i >= 1; i--) {
    rt[i] = vcopy(rt[i + 1]);
    if (last[a[i]] > 0) {
      update(rt[i], 1, n, last[a[i]], 0);
    }
    update(rt[i], 1, n, i, 1);
    last[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int ans = 0, cur = 1;
    while (true) {
      ans++;
      if (t[rt[cur]] <= i) {
        break;
      }
      cur = get(rt[cur], 1, n, i);
    }
    cout << ans << " ";
  }
}
