#include <bits/stdc++.h>
using namespace std;
struct node {
  int val;
  node *l, *r;
  node(int tval, node *tl, node *tr) : val(tval), l(tl), r(tr){};
  node(int tval) : val(tval), l(NULL), r(NULL){};
  node() : val(0), l(NULL), r(NULL){};
};
typedef node *nodep;
void build(nodep &t, int tl, int tr) {
  if (tl == tr) {
    t = new node(0);
    return;
  }
  int tm = (tl + tr) / 2;
  nodep l, r;
  build(l, tl, tm);
  build(r, tm + 1, tr);
  t = new node(0, l, r);
}
void output(nodep t, int tl, int tr) {
  if (tl == tr) {
    cout << t->val << " ";
    return;
  }
  int tm = (tl + tr) / 2;
  output(t->l, tl, tm);
  output(t->r, tm + 1, tr);
}
nodep update(nodep t, int tl, int tr, int pos, int val) {
  if (tl == tr) {
    return new node(val);
  }
  int tm = (tl + tr) / 2;
  nodep res;
  if (pos <= tm) {
    res = update(t->l, tl, tm, pos, val);
    return new node(t->r->val + res->val, res, t->r);
  } else {
    res = update(t->r, tm + 1, tr, pos, val);
    return new node(t->l->val + res->val, t->l, res);
  }
}
int get_sum(nodep t, int tl, int tr, int l, int r) {
  if (l > r || tl > tr || tl > r || tr < l) return 0;
  if (tl == l && tr == r) {
    return t->val;
  }
  int tm = (tl + tr) / 2;
  return get_sum(t->l, tl, tm, l, min(r, tm)) +
         get_sum(t->r, tm + 1, tr, max(l, tm + 1), r);
}
int get_kth(nodep t, int tl, int tr, int k) {
  if (k > t->val) return tr + 1;
  if (tl == tr) {
    return tl;
  }
  int tm = (tl + tr) / 2;
  if (t->l->val >= k)
    return get_kth(t->l, tl, tm, k);
  else
    return get_kth(t->r, tm + 1, tr, k - t->l->val);
}
int main() {
  int n;
  cin >> n;
  vector<int> v(n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &v[i]);
    v[i]--;
  }
  map<int, int> pos;
  vector<nodep> trees(n + 1);
  nodep first_tree;
  build(first_tree, 0, n - 1);
  trees[n] = first_tree;
  for (int r = n - 1; r >= 0; r--) {
    nodep temp = trees[r + 1];
    if (pos.find(v[r]) != pos.end()) {
      temp = update(temp, 0, n - 1, pos[v[r]], 0);
    }
    trees[r] = update(temp, 0, n - 1, r, 1);
    pos[v[r]] = r;
  }
  for (int i = 1; i <= n; i++) {
    int p = 0;
    int c = 0;
    while (p < n) {
      c++;
      p = get_kth(trees[p], 0, n - 1, i + 1);
    }
    printf("%d ", c);
  }
}
