#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e5 + 5, blSize = 700, blNum = 150;
int N, arr[maxN];
int block[blNum][maxN];
int s[blNum], e[blNum];
int blockAns[blNum];
int temp[maxN];
int tempAns;
int rep[maxN];
void tempAdd(int x, int val) {
  tempAns -= temp[x] > 0;
  temp[x] += val;
  tempAns += temp[x] > 0;
}
void solve(int k) {
  int e = 0;
  for (int i = (int)1; i <= (int)N; i++) {
    tempAdd(arr[i], 1);
    tempAdd(arr[i + 1], 1);
    if (tempAns > k or i == N) {
      for (int j = (int)i; j >= (int)e + 1; j--) tempAdd(arr[j], -1);
      e = i;
      rep[k]++;
    }
    tempAdd(arr[i + 1], -1);
  }
}
void blockAdd(int bl, int x, int val) {
  blockAns[bl] -= block[bl][x] > 0;
  block[bl][x] += val;
  blockAns[bl] += block[bl][x] > 0;
}
void solve2(int k) {
  for (int bl = (int)0; bl <= (int)blNum - 1; bl++) {
    if (s[bl] > N) break;
    if (bl) {
      while (s[bl] <= e[bl - 1] and s[bl] <= N) blockAdd(bl, arr[s[bl]++], -1);
      while (e[bl] < s[bl] and e[bl] <= N) blockAdd(bl, arr[++e[bl]], 1);
    }
    while (e[bl] < N) {
      blockAdd(bl, arr[e[bl] + 1], 1);
      if (blockAns[bl] <= k)
        e[bl]++;
      else {
        blockAdd(bl, arr[e[bl] + 1], -1);
        break;
      }
    }
    if (e[bl] == N) rep[k] = bl + 1;
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> N;
  for (int i = (int)1; i <= (int)N; i++) cin >> arr[i];
  for (int k = (int)1; k <= (int)N; k++) {
    if (k <= blSize)
      solve(k);
    else
      solve2(k);
    cout << rep[k] << '\n';
  }
}
