#include <bits/stdc++.h>
using namespace std;
struct Node {
  int qt, l, r;
  Node() : qt(0), l(0), r(0) {}
} st[40 * 100007];
int ptr = 1;
int update(int node, int l, int r, int p, int v) {
  if (p < l || r < p) return node;
  if (l == r) {
    st[ptr].qt = v;
    st[ptr].l = st[node].l;
    st[ptr].r = st[node].r;
    return ptr++;
  }
  int mid = (l + r) >> 1;
  int fe = update(st[node].l, l, mid, p, v);
  int fd = update(st[node].r, mid + 1, r, p, v);
  st[ptr].qt = st[fe].qt + st[fd].qt;
  st[ptr].l = fe;
  st[ptr].r = fd;
  return ptr++;
}
int version[100007], a[100007], lst[100007];
int kth(int node, int l, int r, int v) {
  if (l == r) return l;
  int mid = (l + r) / 2;
  int vv = st[st[node].l].qt;
  if (vv >= v)
    return kth(st[node].l, l, mid, v);
  else
    return kth(st[node].r, mid + 1, r, v - vv);
}
int main() {
  int n;
  scanf("%d", &n);
  memset(lst, -1, sizeof lst);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    if (lst[a[i]] != -1) {
      version[i] = update(version[i - 1], 0, 100007, lst[a[i]], 0);
      lst[a[i]] = i;
      version[i] = update(version[i], 0, 100007, lst[a[i]], 1);
    } else {
      lst[a[i]] = i;
      version[i] = update(version[i - 1], 0, 100007, lst[a[i]], 1);
    }
  }
  for (int i = 1; i <= n; i++) {
    int r = n;
    int ans = 0;
    while (r >= 1) {
      r = kth(version[r], 0, 100007, max(st[version[r]].qt - i, 0));
      ans++;
    }
    printf("%d%c", ans, " \n"[i == n]);
  }
  return 0;
}
