#include <bits/stdc++.h>
using namespace std;
int a[200100];
int rt[200100];
int nxt[200100], pos[200100];
int ch[200100 * 20][2], sum[200100 * 20];
int tot;
int update(int u, int ll, int rr, int x, int v) {
  int k = ++tot;
  ch[k][0] = ch[u][0];
  ch[k][1] = ch[u][1];
  sum[k] = sum[u];
  if (ll == rr) {
    sum[k] += v;
    return k;
  }
  if (x <= ((ll + rr) >> 1))
    ch[k][0] = update(ch[u][0], ll, ((ll + rr) >> 1), x, v);
  else
    ch[k][1] = update(ch[u][1], ((ll + rr) >> 1) + 1, rr, x, v);
  sum[k] = sum[ch[k][0]] + sum[ch[k][1]];
  return k;
}
int n;
int query(int u, int ll, int rr, int k) {
  if (sum[u] < k) return n + 1;
  if (ll == rr) return ll;
  if (sum[ch[u][0]] >= k)
    return query(ch[u][0], ll, ((ll + rr) >> 1), k);
  else
    return query(ch[u][1], ((ll + rr) >> 1) + 1, rr, k - sum[ch[u][0]]);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  for (int i = n; i >= 1; --i) {
    nxt[i] = pos[a[i]];
    pos[a[i]] = i;
  }
  rt[n + 1] = 0;
  for (int i = n; i >= 1; --i) {
    rt[i] = update(rt[i + 1], 1, n, i, 1);
    if (nxt[i]) rt[i] = update(rt[i], 1, n, nxt[i], -1);
  }
  for (int k = 1; k <= n; ++k) {
    int cur = 1;
    int ans;
    for (ans = 1;; ++ans) {
      cur = query(rt[cur], 1, n, k + 1) - 1;
      if (cur == n) break;
      cur++;
    }
    printf("%d%c", ans, k == n ? '\n' : ' ');
  }
}
