#include <bits/stdc++.h>
using namespace std;
int n, a[100100], hea[100100], nex[100100], ans[100100] = {0};
struct T {
  int val, laz;
} tr[1520233];
vector<int> v[100100];
void D(int x) {
  tr[x << 1].laz += tr[x].laz;
  tr[x << 1].val += tr[x].laz;
  tr[x << 1 | 1].laz += tr[x].laz;
  tr[x << 1 | 1].val += tr[x].laz;
  tr[x].laz = 0;
}
void C(int x, int l, int r, int st, int en, int cg) {
  if (l == st && r == en) {
    tr[x].val += cg;
    tr[x].laz += cg;
    return;
  }
  D(x);
  int mid = (l + r) >> 1;
  if (en <= mid) {
    C(x << 1, l, mid, st, en, cg);
    tr[x].val = min(tr[x << 1].val, tr[x << 1 | 1].val);
    return;
  }
  if (st > mid) {
    C(x << 1 | 1, mid + 1, r, st, en, cg);
    tr[x].val = min(tr[x << 1].val, tr[x << 1 | 1].val);
    return;
  }
  C(x << 1, l, mid, st, mid, cg);
  C(x << 1 | 1, mid + 1, r, mid + 1, en, cg);
  tr[x].val = min(tr[x << 1].val, tr[x << 1 | 1].val);
  return;
}
int fin(int x, int l, int r, int v) {
  if (l == r) return l;
  D(x);
  int mid = (l + r) >> 1;
  if (tr[x << 1 | 1].val <= v)
    return fin(x << 1 | 1, mid + 1, r, v);
  else
    return fin(x << 1, l, mid, v);
}
int main() {
  scanf("%d", &n);
  tr[1].val = tr[1].laz = 0;
  for (int i = 1; i <= n; i++) nex[i] = hea[i] = n + 1;
  int x, y;
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = n; i > 0; i--) {
    nex[i] = hea[a[i]];
    hea[a[i]] = i;
  }
  for (int i = 1; i <= n; i++)
    if (hea[i] <= n) C(1, 1, n, hea[i], n, 1);
  for (int i = 1; i <= n; i++) v[1].push_back(i);
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < v[i].size(); j++) {
      x = v[i][j];
      y = fin(1, 1, n, x) + 1;
      v[y].push_back(x);
      ans[x]++;
    }
    C(1, 1, n, i, nex[i] - 1, -1);
  }
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
}
