#include #include #include #include #include #include #include #include using namespace std; using ll = long long; int N; vector A; int F(int K) { vector CNT(N+1, 0); int res = 1; int it = 0; vector value; while (it < N) { if (value.size() < K) { CNT[A[it]]++; if (CNT[A[it]] == 1) value.push_back(A[it]); it++; continue; } if (CNT[A[it]] == 0) { res++; for (auto v : value) CNT[v] = 0; CNT[A[it]]++; value = {}; value.push_back(A[it]); it++; continue; } CNT[A[it]]++; it++; } return res; } int main() { cin >> N; A.assign(N, 0); for (int i = 0;i < N;i++) cin >> A[i]; int B = max(double(1), sqrt(N * log(N))); vector R(N+1, -1); for (int i = 1;i <= B;i++) R[i] = F(i); int T = (N/B) + 2; for (int i = T;i >= 1;i--) { int ok = N; int ng = 0; while (ok-ng > 1) { int mid = (ok + ng) / 2; if (F(mid) <= i) { ok = mid; } else { ng = mid; } } for (int id = max(ok, B+1);id <= N;id++) R[id] = i; } for (int i = 1;i <= N;i++) cout << R[i] << endl; }