#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int mn[4 * N], d[4 * N], a[N + 1], b[N + 1], c[N + 1], nxt[N + 1], ans[N + 1];
vector<int> s[N + 1];
inline void up(int o) { mn[o] = min(mn[o * 2], mn[o * 2 + 1]); }
inline void down(int o, int v) {
  d[o] += v;
  mn[o] -= v;
}
inline void down(int o) {
  if (d[o]) {
    down(o * 2, d[o]);
    down(o * 2 + 1, d[o]);
    d[o] = 0;
  }
}
void modify(int o, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    down(o, 1);
    return;
  }
  down(o);
  int m = (l + r) / 2;
  if (L <= m) modify(o * 2, l, m, L, R);
  if (R > m) modify(o * 2 + 1, m + 1, r, L, R);
  up(o);
}
int query(int o, int l, int r, int v) {
  if (l == r) return l;
  down(o);
  int m = (l + r) / 2;
  return mn[o * 2 + 1] <= v ? query(o * 2 + 1, m + 1, r, v)
                            : query(o * 2, l, m, v);
}
void build(int o, int l, int r) {
  if (l == r) {
    mn[o] = b[l];
    return;
  }
  int m = (l + r) / 2;
  build(o * 2, l, m);
  build(o * 2 + 1, m + 1, r);
  up(o);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = (1), i_ = (n); i <= i_; ++i) {
    scanf("%d", &a[i]);
    b[i] = b[i - 1] + !c[a[i]];
    c[a[i]] = 1;
    s[0].push_back(i);
  }
  fill_n(c + 1, n, n + 1);
  for (int i = (n), i_ = (1); i >= i_; --i) {
    nxt[i] = c[a[i]];
    c[a[i]] = i;
  }
  build(1, 1, n);
  for (int i = (0), i_ = (n); i < i_; ++i) {
    for (int j = (0), j_ = (s[i].size()); j < j_; ++j) {
      int t = query(1, 1, n, s[i][j]);
      s[t].push_back(s[i][j]);
      ++ans[s[i][j]];
    }
    modify(1, 1, n, i + 1, nxt[i + 1] - 1);
  }
  for (int i = (1), i_ = (n); i <= i_; ++i)
    printf("%d%c", ans[i], " \n"[i == n]);
  return 0;
}
