#include <bits/stdc++.h>
using namespace std;
int n;
int a[110000], pre[110000], pos[110000], ans[110000], tr[110000 << 2];
vector<int> vec[110000];
int cmp(int x, int y) { return pre[x] < pre[y]; }
void insert(int l, int r, int now, int pos, int v) {
  tr[now] += v;
  if (l == r) return;
  int mid = (l + r) >> 1;
  if (mid >= pos)
    insert(l, mid, now << 1, pos, v);
  else
    insert(mid + 1, r, now << 1 | 1, pos, v);
}
int query(int l, int r, int now, int v) {
  if (l == r) return l;
  int mid = (l + r) >> 1;
  if (tr[now << 1] >= v)
    return query(l, mid, now << 1, v);
  else
    return query(mid + 1, r, now << 1 | 1, v - tr[now << 1]);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) {
    pre[i] = pos[a[i]];
    pos[a[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    pos[i] = i;
    vec[1].push_back(i);
  }
  sort(pos + 1, pos + 1 + n, cmp);
  for (int i = 1, now = 1; i <= n; i++) {
    for (int t; pre[t = pos[now]] < i && now <= n; now++) insert(1, n, 1, t, 1);
    for (int j = 0, t; j < vec[i].size(); j++) {
      t = vec[i][j];
      ans[t]++;
      if (tr[1] <= t) continue;
      int t1 = query(1, n, 1, t + 1);
      vec[t1].push_back(t);
    }
    insert(1, n, 1, i, -1);
  }
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  return 0;
}
