#include <bits/stdc++.h>
using namespace std;
int N;
int A[100000];
int pre[100000];
int nxt[100000];
int loc[100000];
vector<int> kvals[100000];
int seg[2 * (1 << 17)];
void update(int i, int v) {
  i += (1 << 17);
  seg[i] = v;
  for (i /= 2; i > 0; i /= 2) seg[i] = seg[2 * i] + seg[2 * i + 1];
}
int getMax(int k) {
  int i = 1;
  while (i < (1 << 17)) {
    if (seg[2 * i] > k)
      i = 2 * i;
    else {
      k -= seg[2 * i];
      i = 2 * i + 1;
    }
  }
  return i - (1 << 17);
}
int ans[100001];
int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> A[i];
    A[i]--;
  }
  for (int i = 0; i < N; i++) loc[i] = -1;
  for (int i = 0; i < N; i++) {
    nxt[i] = N;
    pre[i] = loc[A[i]];
    loc[A[i]] = i;
    if (pre[i] > -1)
      nxt[pre[i]] = i;
    else
      seg[i + (1 << 17)] = 1;
  }
  for (int i = (1 << 17) - 1; i > 0; i--) seg[i] = seg[2 * i] + seg[2 * i + 1];
  for (int i = 1; i <= N; i++) kvals[0].push_back(i);
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < kvals[i].size(); j++) {
      int ni = getMax(kvals[i][j]);
      if (ni < N) kvals[ni].push_back(kvals[i][j]);
      ans[kvals[i][j]]++;
    }
    update(i, 0);
    if (nxt[i] < N) update(nxt[i], 1);
  }
  for (int i = 1; i <= N; i++) cout << ans[i] << ' ';
  cout << '\n';
}
