#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100100;
struct st {
  st *fe, *fd;
  int meio, soma, l, r;
  st(int x, int y) {
    soma = 0;
    l = x, r = y;
    meio = (x + y) / 2;
    if (x == y) return;
    fe = new st(x, meio);
    fd = new st(meio + 1, y);
  }
  st(st *node) {
    fe = node->fe;
    fd = node->fd;
    soma = node->soma;
    meio = node->meio;
    l = node->l;
    r = node->r;
  }
  st *up(int pos, int val) {
    st *node = new st(*this);
    node->soma += val;
    if (l == r) return node;
    if (pos <= meio)
      node->fe = fe->up(pos, val);
    else
      node->fd = fd->up(pos, val);
    return node;
  }
  int get(int k) {
    if (l == r) return l;
    if (fe->soma < k)
      return fd->get(k - fe->soma);
    else
      return fe->get(k);
  }
};
st *version[MAXN];
int last[MAXN];
int v[MAXN];
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> v[i];
    last[i] = -1;
  }
  version[n + 1] = new st(1, n + 1);
  for (int i = n; i >= 1; i--) {
    if (last[v[i]] != -1) version[i] = (*version[i + 1]).up(last[v[i]], -1);
    if (last[v[i]] == -1)
      version[i] = (*version[i + 1]).up(i, 1);
    else
      version[i] = (*version[i]).up(i, 1);
    last[v[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int cont = 0;
    int at = 1;
    while (true) {
      cont++;
      int x = version[at]->get(i + 1);
      if (x == n + 1) break;
      at = x;
    }
    cout << cont << " ";
  }
}
