#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int n, A[MAXN], lson[MAXN * 40], rson[MAXN * 40], sum[MAXN * 40], mark,
    rt[MAXN], jump[MAXN], last[MAXN];
void build(int &node, int L, int R) {
  node = ++mark;
  sum[node] = 0;
  if (L == R) return;
  int mid = (L + R) >> 1;
  build(lson[node], L, mid);
  build(rson[node], mid + 1, R);
}
void insert(int &node, int ot, int x, int num, int L, int R) {
  node = ++mark;
  sum[node] = sum[ot] + num;
  lson[node] = lson[ot];
  rson[node] = rson[ot];
  if (L == R) return;
  int mid = (L + R) >> 1;
  if (x <= mid)
    insert(lson[node], lson[ot], x, num, L, mid);
  else
    insert(rson[node], rson[ot], x, num, mid + 1, R);
}
void debug(int node, int L, int R) {
  cout << sum[node] << " " << L << " " << R << endl;
  int mid = (L + R) >> 1;
  if (L == R) return;
  debug(lson[node], L, mid);
  debug(rson[node], mid + 1, R);
}
int query(int node, int L, int R, int k) {
  if (L == R) {
    if (sum[node] <= k)
      return L;
    else
      return L - 1;
  }
  int cnt = sum[lson[node]];
  int mid = (L + R) >> 1;
  if (cnt <= k)
    return query(rson[node], mid + 1, R, k - cnt);
  else
    return query(lson[node], L, mid, k);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &A[i]);
  build(rt[n + 1], 1, n);
  for (int i = n; i >= 1; i--) {
    if (last[A[i]]) {
      int tmp;
      insert(tmp, rt[i + 1], last[A[i]], -1, 1, n);
      insert(rt[i], tmp, i, 1, 1, n);
    } else {
      insert(rt[i], rt[i + 1], i, 1, 1, n);
    }
    last[A[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int ans = 0;
    for (int l = 1; l <= n;) {
      int r = query(rt[l], 1, n, i);
      ans++;
      l = r + 1;
    }
    printf("%d ", ans);
  }
  return 0;
}
