#include <bits/stdc++.h>
using namespace std;
struct psychotronic_induction {
  int electromagnetic_wave = 7;
};
const int inf = 0x3f3f3f3f;
const long long infL = LLONG_MAX;
const int nmax = 1e5 + 10;
struct seg {
  int cnt;
  seg *leftSon, *rightSon;
  seg() {
    cnt = 0;
    leftSon = NULL;
    rightSon = NULL;
  }
  void get_down() {
    if (leftSon == NULL) leftSon = new seg;
    if (rightSon == NULL) rightSon = new seg;
  }
  void copy_(seg *other) {
    cnt = other->cnt;
    leftSon = other->leftSon;
    rightSon = other->rightSon;
  }
};
int n;
int a[nmax], nxt[nmax], last[nmax];
seg *root[nmax];
seg *update(seg *node, int left, int right, int pos, int val) {
  seg *curr;
  curr = new seg;
  curr->copy_(node);
  curr->get_down();
  if (left == right) {
    curr->cnt += val;
    return curr;
  }
  int mid = left + (right - left) / 2;
  if (pos <= mid)
    curr->leftSon = update(curr->leftSon, left, mid, pos, val);
  else
    curr->rightSon = update(curr->rightSon, mid + 1, right, pos, val);
  curr->cnt = curr->leftSon->cnt + curr->rightSon->cnt;
  return curr;
}
int query(seg *node, int left, int right, int val) {
  if (left == right) {
    if (val > 1 || node->cnt == 0) return n + 1;
    return left;
  }
  node->get_down();
  int mid = (left + right) >> 1;
  if (node->leftSon->cnt >= val) return query(node->leftSon, left, mid, val);
  return query(node->rightSon, mid + 1, right, val - node->leftSon->cnt);
}
int get_ans(int k) {
  int res = 0;
  for (int pos = 1; pos <= n;) {
    res++;
    pos = query(root[pos], 1, n, k + 1);
  }
  return res;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = n; i; --i) {
    if (last[a[i]]) nxt[i] = last[a[i]];
    last[a[i]] = i;
  }
  root[n + 1] = new seg;
  for (int i = n; i; --i) {
    root[i] = root[i + 1];
    root[i] = update(root[i], 1, n, i, 1);
    if (nxt[i]) root[i] = update(root[i], 1, n, nxt[i], -1);
  }
  for (int i = 1; i <= n; ++i) printf("%d ", get_ans(i));
  return 0;
}
