#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
struct data {
  int lc, rc, sum;
} t[100500 * 40];
int a[100500], last[100500], rt[100500], n, cnt;
int build(int l, int r) {
  int x = ++cnt;
  t[x].lc = t[x].rc = 0;
  t[x].sum = 0;
  if (l == r) return x;
  int mid = (l + r) / 2;
  t[x].lc = build(l, mid);
  t[x].rc = build(mid + 1, r);
  return x;
}
void add(int l, int r, int &now, int pre, int v, int c) {
  now = ++cnt;
  t[cnt] = t[pre];
  t[cnt].sum += c;
  if (l == r) return;
  int mid = (l + r) / 2;
  if (v <= mid) add(l, mid, t[now].lc, t[pre].lc, v, c);
  if (v > mid) add(mid + 1, r, t[now].rc, t[pre].rc, v, c);
}
int ask(int now, int l, int r, int k) {
  if (l == r) return l;
  int sum = t[t[now].lc].sum;
  int mid = (l + r) / 2;
  if (sum > k)
    return ask(t[now].lc, l, mid, k);
  else
    return ask(t[now].rc, mid + 1, r, k - sum);
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  rt[n + 1] = build(1, n + 1);
  for (int i = n; i >= 1; i--) {
    int v = a[i];
    if (!last[v])
      add(1, n + 1, rt[i], rt[i + 1], i, 1), last[v] = i;
    else {
      add(1, n + 1, rt[i], rt[i + 1], last[v], -1);
      add(1, n + 1, rt[i], rt[i], i, 1);
      last[v] = i;
    }
  }
  for (int k = 1; k <= n; k++) {
    int L = 1, ans = 0;
    while (L <= n) {
      int pos = ask(rt[L], 1, n + 1, k);
      ans++;
      L = pos;
    }
    printf("%d ", ans);
  }
  return 0;
}
