#include <bits/stdc++.h>
using namespace std;
int n, A[100010], st[100010], Ans[100010];
vector<int> B[100010], C[100010];
struct Binary_Indexed_Tree {
  int bit[100010];
  void Add(int i, int x) {
    while (i <= n) {
      bit[i] += x;
      i += i & -i;
    }
  }
  int Query(int x) {
    int i, res = 0;
    for (i = 16; i >= 0; i--) {
      int t = res | (1 << i);
      if (t <= n && x - bit[t] >= 0) {
        res = t;
        x -= bit[t];
      }
    }
    return res;
  }
} BIT;
void Deal(int x) {
  if (st[x] < (int)B[x].size()) {
    BIT.Add(B[x][st[x]++], 1);
  }
}
int main() {
  int i, j;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%d", &A[i]);
    B[A[i]].push_back(i);
    C[1].push_back(i);
  }
  for (i = 1; i <= n; i++) {
    Deal(i);
  }
  for (i = 1; i <= n; i++) {
    for (j = 0; j < (int)C[i].size(); j++) {
      int x = C[i][j];
      int R = BIT.Query(x);
      Ans[x]++;
      C[R + 1].push_back(x);
    }
    BIT.Add(i, -1);
    Deal(A[i]);
  }
  for (i = 1; i <= n; i++) {
    printf("%d%c", Ans[i], " \n"[i == n]);
  }
  return 0;
}
