func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( Ofast ,  unroll-loops ,  omit-frame-pointer ,  inline )   #pragma GCC optimize(3)   using namespace std;   const long long INF = 1e17;   const long long maxn = 1e5 + 700;   const int mod = 998244353;   const int up = 1e9;   template <typename T>   inline void read(T &a) {     char c = getchar();     T x = 0, f = 1;     while (!isdigit(c)) {       if (c ==  - ) f = -1;       c = getchar();     }     while (isdigit(c)) {       x = (x << 1) + (x << 3) + c -  0 ;       c = getchar();     }     a = f * x;   }   long long n, m, p;   int num[maxn];   struct node {     int tag, w, l, r;   } t[maxn * 40];   int root[maxn * 40];   int cnt = 0;   void Modify(int &now, int pre, int l, int r, int x, int y, int w) {     t[now = ++cnt] = t[pre];     if (x <= l && y >= r) {       t[now].tag += w;       t[now].w += w;       return;     }     int mid = (l + r) / 2;     if (x <= mid) Modify(t[now].l, t[pre].l, l, mid, x, y, w);     if (y > mid) Modify(t[now].r, t[pre].r, mid + 1, r, x, y, w);     int ls = t[now].l, rs = t[now].r;     t[now].w = min(t[ls].w, t[rs].w) + t[now].tag;   }   int Query(int now, int l, int r, int id, int tag, int k) {     if (l == r) return l;     int mid = (l + r) / 2;     if (mid < id) return Query(t[now].r, mid + 1, r, id, tag + t[now].tag, k);     int ls = t[now].l, rs = t[now].r;     return t[rs].w + tag + t[now].tag > k                ? Query(ls, l, mid, id, tag + t[now].tag, k)                : Query(rs, mid + 1, r, id, tag + t[now].tag, k);   }   int work(int x) {     int s = 1, ans = 0;     while (s <= n) {       s = Query(root[s], 1, n, s, 0, x) + 1;       ans++;     }     return ans;   }   int last[maxn];   int main() {     read(n);     for (int i = 1; i <= n; i++) read(num[i]);     for (int i = n; i >= 1; i--) {       int up = last[num[i]] ? last[num[i]] - 1 : n;       Modify(root[i], root[i + 1], 1, n, i, up, 1);       last[num[i]] = i;     }     for (int i = 1; i <= n; i++) printf( %d  , work(i));     return 0;   }   