#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 9;
struct Node {
  Node() : L(nullptr), R(nullptr), sum(0) {}
  Node(int val) : L(nullptr), R(nullptr), sum(val) {}
  Node(Node* left, Node* right) : L(left), R(right), sum(L->sum + R->sum) {}
  Node* L;
  Node* R;
  int sum;
} * tree[MAX];
int n, a[MAX], lst[MAX];
int idx, delta, l, r;
deque<Node> dq;
Node* fetchNode(Node* left, Node* right) {
  dq.push_back(Node(left, right));
  return &dq.back();
}
Node* fetchNode(int val) {
  dq.push_back(Node(val));
  return &dq.back();
}
Node* build(int low, int high) {
  if (low == high) {
    return fetchNode(0);
  }
  int mid = ((low + high) >> 1);
  return fetchNode(build(low, mid), build(mid + 1, high));
}
Node* upd(Node* T, int low, int high) {
  if (low == high) {
    return fetchNode(delta);
  }
  int mid = ((low + high) >> 1);
  if (idx <= mid) {
    return fetchNode(upd(T->L, low, mid), T->R);
  } else {
    return fetchNode(T->L, upd(T->R, mid + 1, high));
  }
}
int qwr(Node* T, int low, int high, int val) {
  if (low == high) {
    return low;
  }
  int mid = ((low + high) >> 1);
  if ((T->L->sum) > val) {
    return qwr(T->L, low, mid, val);
  } else {
    return qwr(T->R, mid + 1, high, val - (T->L->sum));
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  tree[n + 1] = build(1, n + 1);
  for (int i = n; i >= 1; --i) {
    tree[i] = tree[i + 1];
    if (lst[a[i]]) {
      idx = lst[a[i]];
      delta = 0;
      tree[i] = upd(tree[i], 1, n + 1);
    }
    idx = i;
    delta = 1;
    tree[i] = upd(tree[i], 1, n + 1);
    lst[a[i]] = i;
  }
  for (int k = 1; k <= n; ++k) {
    int cur = 1, ans = 0;
    while (cur <= n) {
      ++ans;
      cur = qwr(tree[cur], 1, n + 1, k);
    }
    cout << ans << " ";
  }
  return 0;
}
