#include <bits/stdc++.h>
using namespace std;
const int SZ = 100333;
int N;
int arr[SZ];
struct Node {
  int val = 0;
  Node *l = NULL, *r = NULL;
  static Node* buildWhole(int lo = 1, int hi = N) {
    Node* ret = new Node();
    if (lo == hi) return ret;
    int mi = (lo + hi) / 2;
    ret->l = buildWhole(lo, mi);
    ret->r = buildWhole(mi + 1, hi);
    return ret;
  }
  Node* buildUponThis(int idx, int val, int lo = 1, int hi = N) {
    if (idx < lo || hi < idx) return this;
    Node* ret = new Node();
    if (lo == hi) {
      ret->val = val;
      return ret;
    }
    int mi = (lo + hi) / 2;
    ret->l = l->buildUponThis(idx, val, lo, mi);
    ret->r = r->buildUponThis(idx, val, mi + 1, hi);
    ret->val = ret->l->val + ret->r->val;
    return ret;
  }
  int kthIndex(int S, int lo = 1, int hi = N) {
    if (val < S) return N + 1;
    if (lo == hi) return lo;
    int mi = (lo + hi) / 2;
    if (S <= l->val)
      return l->kthIndex(S, lo, mi);
    else
      return r->kthIndex(S - (l->val), mi + 1, hi);
  }
};
int lastIdx[SZ];
Node* roots[SZ];
int main() {
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d", arr + i);
  Node* now = Node::buildWhole();
  for (int i = N; i >= 1; i--) {
    if (lastIdx[arr[i]]) now = now->buildUponThis(lastIdx[arr[i]], 0);
    now = now->buildUponThis(i, 1);
    roots[i] = now;
    lastIdx[arr[i]] = i;
  }
  for (int k = 1; k <= N; k++) {
    int ans = 0;
    int i = 1;
    while (i <= N) {
      i = roots[i]->kthIndex(k + 1);
      ans++;
    }
    printf("%d ", ans);
  }
  putchar('\n');
  return 0;
}
