#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
static bool constexpr dbg = 0;
ll constexpr NM = 1.1e5;
ll n;
ll a[NM];
ll res[NM];
struct Node {
  ll v = 0;
  Node *l = 0, *r = 0;
};
Node r[NM];
void init0(Node *cur, ll l, ll r) {
  if (l == r) return;
  auto mid = (l + r) / 2;
  cur->l = new Node;
  cur->r = new Node;
  init0(cur->l, l, mid);
  init0(cur->r, mid + 1, r);
}
void update(Node *prev, Node *cur, ll l, ll r, ll i, ll val) {
  if (i < l || i > r) return;
  if (l == r) {
    cur->v = val;
    return;
  }
  auto mid = (l + r) / 2;
  if (i <= mid) {
    if (!cur->l || cur->l == prev->l) cur->l = new Node;
    if (!cur->r) cur->r = prev->r;
    update(prev->l, cur->l, l, mid, i, val);
  } else {
    if (!cur->r || cur->r == prev->r) cur->r = new Node;
    if (!cur->l) cur->l = prev->l;
    update(prev->r, cur->r, mid + 1, r, i, val);
  }
  cur->v = cur->l->v + cur->r->v;
}
ll sum(Node *n, ll l, ll r, ll ql, ll qr) {
  if (ql > r || qr < l) return 0;
  if (l == r) return n->v;
  auto mid = (l + r) / 2;
  return sum(n->l, l, mid, ql, qr) + sum(n->r, mid + 1, r, ql, qr);
}
ll query(Node *no, ll l, ll r, ll k) {
  if (no->v <= k) return l - 1;
  if (l == r) return l;
  auto mid = (l + r) / 2;
  if (no->r->v > k)
    return query(no->r, mid + 1, r, k);
  else
    return query(no->l, l, mid, k - no->r->v);
}
int main() {
  cin >> n;
  for (ll i = 1; i <= (ll)(n); ++i) cin >> a[i];
  init0(&r[0], 1, n);
  map<ll, ll> mp;
  for (ll i = 1; i <= (ll)(n); ++i) {
    auto prev = &r[i - 1], cur = &r[i];
    if (mp.count(a[i])) update(prev, cur, 1, n, mp[a[i]], 0);
    mp[a[i]] = i;
    update(prev, cur, 1, n, i, 1);
  }
  for (ll k = 1; k <= (ll)(n); ++k) {
    ll i = n;
    ll res = 0;
    while (i >= 1) {
      ++res;
      i = query(&r[i], 1, n, k);
    }
    cout << res << ' ';
  }
  cout << '\n';
  return 0;
}
