#include <bits/stdc++.h>
using namespace std;
int v[100005];
int n;
struct node {
  int num;
  int pre;
  int nxt;
};
node rr[100005];
int col[100005];
int vol[100005];
int mq[100005][2];
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &rr[i].num);
    rr[i].pre = v[rr[i].num];
    v[rr[i].num] = i;
    col[i] = i;
    vol[i] = 1;
    mq[i][1] = i;
  }
  for (int i = n; i >= 1; i--) {
    rr[i].nxt = v[rr[i].num];
    v[rr[i].num] = i;
  }
  for (int i = 1; i <= n; i++) {
    int j = col[1] + 1, k = 1, st = 1, h = i & 1, l = 2;
    int now = mq[1][h];
    int nxt = mq[2][h];
    mq[k][h ^ 1] = now;
    while (j <= n) {
      if (rr[j].pre >= st) {
        col[now]++;
        if (rr[j].nxt > col[nxt] || rr[j].nxt == j) {
          vol[nxt]--;
          if (vol[nxt] == 0) nxt = mq[++l][h];
        }
        j++;
      } else if (vol[now] < i) {
        vol[now]++;
        col[now]++;
        if (rr[j].nxt > col[nxt] || rr[j].nxt == j) {
          vol[nxt]--;
          if (vol[nxt] == 0) nxt = mq[++l][h];
        }
        j++;
      } else {
        st = col[now] + 1;
        j = col[nxt] + 1;
        now = nxt;
        nxt = mq[++l][h];
        mq[++k][h ^ 1] = now;
        if (j > n) break;
      }
    }
    printf("%d ", k);
  }
  return 0;
}
