#include <bits/stdc++.h>
using namespace std;
const int maxn = 201010;
class Tseg {
 private:
  int tot, n;
  struct Tnode {
    Tnode *ls, *rs;
    int sum;
  } * root[maxn], t[maxn * 20];
  Tnode *newnode() {
    ++tot, t[tot].ls = t[tot].rs = 0;
    t[tot].sum = 0;
    return &t[tot];
  }
  void Build(Tnode *&p, int l, int r) {
    p = newnode();
    if (l == r) return;
    int mid = (l + r) >> 1;
    Build(p->ls, l, mid);
    Build(p->rs, mid + 1, r);
  }
  void Insert(Tnode *&p, Tnode *last, int l, int r, int x, int tmp) {
    p = newnode(), *p = *last;
    p->sum += tmp;
    if (l == r) return;
    int mid = (l + r) >> 1;
    if (x <= mid)
      Insert(p->ls, last->ls, l, mid, x, tmp);
    else
      Insert(p->rs, last->rs, mid + 1, r, x, tmp);
  }
  int Query(Tnode *x, int l, int r, int k) {
    if (l == r) return l + (k < x->sum);
    int mid = (l + r) >> 1;
    if (x->rs->sum > k)
      return Query(x->rs, mid + 1, r, k);
    else
      return Query(x->ls, l, mid, k - x->rs->sum);
  }

 public:
  void build(int nn) {
    tot = 0;
    n = nn;
    Build(root[0], 1, n);
  }
  void insert(int k, int x, int tmp) {
    Insert(root[k], root[k - 1], 1, n, x, tmp);
  }
  int query(int x, int k) { return Query(root[x], 1, n, k); }
} T;
int n;
int k[maxn], last[maxn], rot[maxn];
int main() {
  scanf("%d", &n);
  memset(last, 0, sizeof(last));
  T.build(n);
  int tot = 0;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &k[i]);
    if (last[k[i]]) tot++, T.insert(tot, last[k[i]], -1);
    tot++;
    rot[i] = tot, T.insert(tot, i, 1);
    last[k[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int st = n, ans = 0;
    while (st) {
      ans++;
      st = T.query(rot[st], i) - 1;
    }
    printf("%d ", ans);
  }
  cout << endl;
  return 0;
}
