#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
const int G = 100001;
int a, m[G], o[G], U = 600, TIME = 0;
int us[G];
int calc(int d) {
  if (o[d]) return o[d];
  int ans = 0, cd = 0;
  TIME++;
  for (int q = 0; q < a; q++) {
    if (us[m[q]] != TIME) cd++, us[m[q]] = TIME;
    if (cd > d) {
      us[m[q]] = ++TIME;
      ans++;
      cd = 1;
    }
  }
  return o[d] = ans + (cd > 0);
}
int main() {
  cin.tie(0);
  cout.tie(0);
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  ;
  memset(o, 0, sizeof(o));
  ;
  memset(us, -1, sizeof(us));
  ;
  cin >> a;
  for (int q = 0; q < a; q++) cin >> m[q];
  for (int q = 1; q <= min(a, U); q++) calc(q);
  for (int q = U + 1; q <= a;) {
    int tyt = calc(q), L = q, R = a + 1;
    for (; L + 1 < R;) {
      int md = (L + R) / 2;
      if (calc(md) == tyt)
        L = md;
      else
        R = md;
    }
    for (; q <= L; q++) o[q] = tyt;
  }
  for (int q = 1; q <= a; q++) cout << o[q] << " ";
}
