#include <bits/stdc++.h>
int n;
constexpr int maxn = 100010;
int a[maxn];
class Node {
 public:
  Node *left_child = nullptr;
  Node *right_child = nullptr;
  int l = -1, r = -1;
  int sum = 0;
};
Node *root[maxn];
Node *node_pool;
int idx = 0;
Node *init_empty_segtree(int l, int r) {
  Node *ans = node_pool + idx;
  idx++;
  if (l != r) {
    int mid = (l + r) / 2;
    ans->left_child = init_empty_segtree(l, mid);
    ans->right_child = init_empty_segtree(mid + 1, r);
  }
  ans->l = l;
  ans->r = r;
  return ans;
}
Node *erase(Node *cur, int target) {
  Node *ans = node_pool + (idx++);
  ans->l = cur->l;
  ans->r = cur->r;
  ans->sum = cur->sum - 1;
  ans->left_child = cur->left_child;
  ans->right_child = cur->right_child;
  if (cur->l != cur->r) {
    int mid = (ans->l + ans->r) / 2;
    if (target <= mid) {
      ans->left_child = erase(cur->left_child, target);
    } else {
      ans->right_child = erase(cur->right_child, target);
    }
  }
  return ans;
}
Node *insert(Node *cur, int target) {
  Node *ans = node_pool + (idx++);
  ans->l = cur->l;
  ans->r = cur->r;
  ans->sum = cur->sum + 1;
  ans->left_child = cur->left_child;
  ans->right_child = cur->right_child;
  if (cur->l != cur->r) {
    int mid = (ans->l + ans->r) / 2;
    if (target <= mid) {
      ans->left_child = insert(cur->left_child, target);
    } else {
      ans->right_child = insert(cur->right_child, target);
    }
  }
  return ans;
}
int query(Node *cur, int target) {
  if (cur->l == cur->r) {
    return cur->l;
  }
  if (target <= cur->left_child->sum) {
    return query(cur->left_child, target);
  } else {
    return query(cur->right_child, target - cur->left_child->sum);
  }
}
int main() {
  using std::cin, std::cout, std::endl;
  std::ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  node_pool = new Node[n * 100];
  root[n + 1] = init_empty_segtree(1, n);
  std::map<int, int> colors;
  for (int i = n; i >= 1; i--) {
    Node *prev = root[i + 1];
    if (colors.count(a[i])) {
      prev = erase(prev, colors[a[i]]);
    }
    root[i] = insert(prev, i);
    colors[a[i]] = i;
  }
  for (int k = 1; k <= n; k++) {
    int ans = 0;
    for (int l = 1; l <= n; ans++) {
      if (root[l]->sum <= k) {
        ans++;
        break;
      }
      l = query(root[l], k + 1);
    }
    cout << ans << " ";
  }
  return 0;
}
