#include <bits/stdc++.h>   using namespace std;   struct Node {     int sum = 0;     Node *L = 0, *R = 0;     Node() {}     Node(int s, Node* l, Node* r) : sum(s), L(l), R(r) {}   };   typedef Node* Ptr;   Ptr tree[100100];   Ptr create() {     Ptr p = new Node();     p->L = p->R = p;     return p;   }   Ptr add(Ptr root, int fr, int to, int i) {     if (fr == to) {       return new Node(1, 0, 0);     }     if (i <= ((fr + to) / 2))       return new Node(1 + root->sum, add(root->L, fr, ((fr + to) / 2), i),                       root->R);     return new Node(1 + root->sum, root->L,                     add(root->R, ((fr + to) / 2) + 1, to, i));   }   void print(Ptr root, int fr, int to) {     if (fr == to) return;     print(root->L, fr, ((fr + to) / 2));     print(root->R, ((fr + to) / 2) + 1, to);   }   int getSum(Ptr root, int fr, int to, int a, int b) {     if (fr == a && to == b) return root->sum;     if (b <= ((fr + to) / 2)) return getSum(root->L, fr, ((fr + to) / 2), a, b);     if (a > ((fr + to) / 2))       return getSum(root->R, ((fr + to) / 2) + 1, to, a, b);     return getSum(root->L, fr, ((fr + to) / 2), a, ((fr + to) / 2)) +            getSum(root->R, ((fr + to) / 2) + 1, to, ((fr + to) / 2) + 1, b);   }   int getKth(Ptr root, int fr, int to, int k) {     if (to - fr + 1 == root->sum) return fr + k - 1;     if (root->L->sum >= k) return getKth(root->L, fr, ((fr + to) / 2), k);     return getKth(root->R, ((fr + to) / 2) + 1, to, k - root->L->sum);   }   int n;   int getKth(Ptr root, int i, int k) {     const int countBefore = i == 1 ? 0 : getSum(root, 1, n, 1, i - 1);     k += countBefore;     if (root->sum < k) return n + 1;     return getKth(root, 1, n, k);   }   int solve(int k) {     int i = 1;     int ans = 0;     while (i <= n) {       const int newI = getKth(tree[i - 1], i, k + 1);       i = newI;       ans++;     }     return ans;   }   int color[100100];   int lastSeen[100100];   int prv[100100];   int ans[100100];   vector<int> prvInv[100100];   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; ++i) {       scanf( %d , color + i);       prv[i] = lastSeen[color[i]];       prvInv[prv[i]].push_back(i);       lastSeen[color[i]] = i;     }     for (int i = 0; i <= n; ++i) {       tree[i] = !i ? create() : tree[i - 1];       for (int j : prvInv[i]) tree[i] = add(tree[i], 1, n, j);     }     for (int k = 1; k <= n; ++k) ans[k] = solve(k);     for (int k = 1; k <= n; ++k) printf( %d%c , ans[k],    n [k == n]);     return 0;   }   