#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int N;
struct Node {
  int sum, lc, rc;
} pst[maxn * 40];
int a[maxn];
int pre[maxn];
int pst_rt[maxn];
int cnt = 1;
void dup(int &node) {
  pst[cnt++] = pst[node];
  node = cnt - 1;
}
void update(int &node, int l, int r, int val, int pos) {
  dup(node);
  if (l == r) {
    pst[node].sum += val;
    return;
  }
  int mid = (l + r) >> 1;
  if (pos <= mid) update(pst[node].lc, l, mid, val, pos);
  if (pos > mid) update(pst[node].rc, mid + 1, r, val, pos);
  pst[node].sum = pst[pst[node].lc].sum + pst[pst[node].rc].sum;
}
int query(int node, int l, int r, int k) {
  if (l == r) {
    return l;
  }
  int mid = (l + r) >> 1;
  int ltot = pst[pst[node].lc].sum;
  if (ltot > k) {
    return query(pst[node].lc, l, mid, k);
  } else {
    return query(pst[node].rc, mid + 1, r, k - ltot);
  }
}
void output(int node, int l, int r) {
  printf("node:%d, l:%d, r:%d, sum:%d ", node, l, r, pst[node].sum);
  if (l == r) {
    printf("\n");
    return;
  }
  printf("lnode:%d rnode:%d\n", pst[node].lc, pst[node].rc);
  int mid = (l + r) >> 1;
  output(pst[node].lc, l, mid);
  output(pst[node].rc, mid + 1, r);
}
int main() {
  memset(pre, -1, sizeof(pre));
  scanf("%d", &N);
  for (int i = 0; i < N; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = N; i > 0; i--) {
    pst_rt[i] = pst_rt[i + 1];
    if (pre[a[i - 1]] == -1) {
      update(pst_rt[i], 1, N + 1, 1, i);
    } else {
      update(pst_rt[i], 1, N + 1, -1, pre[a[i - 1]]);
      update(pst_rt[i], 1, N + 1, 1, i);
    }
    pre[a[i - 1]] = i;
  }
  for (int i = 1; i <= N; i++) {
    int r = 1;
    int ans = 0;
    while (r <= N) {
      ans++;
      r = query(pst_rt[r], 1, N + 1, i);
    }
    printf("%d ", ans);
  }
}
