#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
int n;
int a[N];
int last[N];
int nxt[N];
struct PersistentSegTree {
struct Node {
int l = 0, r = 0;
int sum = 0;
};
int n;
vector<Node> seg;
PersistentSegTree(int n) : n(n) {
seg.push_back(Node());
}
int update(int pre, int l, int r, int pos, int val) {
int cur = seg.size();
seg.push_back(seg[pre]);
if (l == r) {
seg[cur].sum += val;
return cur;
}
int mid = (l + r) >> 1;
if (pos <= mid) {
seg[cur].l = update(seg[pre].l, l, mid, pos, val);
}
else {
seg[cur].r = update(seg[pre].r, mid + 1, r, pos, val);
}
int lc = seg[cur].l, rc = seg[cur].r;
seg[cur].sum = seg[lc].sum + seg[rc].sum;
return cur;
}
int getKth(int rt, int l, int r, int k) {
if (seg[rt].sum < k) return n + 1;
if (l == r) return l;
int mid = (l + r) >> 1;
int lc = seg[rt].l, rc = seg[rt].r;
if (k <= seg[lc].sum) {
return getKth(lc, l, mid, k);
}
return getKth(rc, mid + 1, r, k - seg[lc].sum);
}
int update(int pre, int pos, int val) {
return update(pre, 1, n, pos, val);
}
int getKth(int rt, int k) {
return getKth(rt, 1, n, k);
}
};
int root[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int x = 1; x <= n; x++) last[x] = n + 1;
for (int i = n; i >= 1; i--) {
nxt[i] = last[a[i]];
last[a[i]] = i;
}
PersistentSegTree pst(n);
for (int i = n; i >= 1; i--) {
root[i] = root[i + 1];
root[i] = pst.update(root[i], i, 1);
if (nxt[i] <= n) root[i] = pst.update(root[i], nxt[i], -1);
}
for (int k = 1; k <= n; k++) {
int ans = 0;
int i = 1;
while (i <= n) {
i = pst.getKth(root[i], k + 1);
++ans;
}
cout << ans << ' ';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAgCgppbnQgbjsgIAppbnQgYVtOXTsgCgppbnQgbGFzdFtOXTsgCmludCBueHRbTl07IAoKc3RydWN0IFBlcnNpc3RlbnRTZWdUcmVlIHsKCXN0cnVjdCBOb2RlIHsKCQlpbnQgbCA9IDAsIHIgPSAwOyAgIAoJCWludCBzdW0gPSAwOyAgCgl9OyAKCglpbnQgbjsgCgl2ZWN0b3I8Tm9kZT4gc2VnOyAKCglQZXJzaXN0ZW50U2VnVHJlZShpbnQgbikgOiBuKG4pIHsKCQlzZWcucHVzaF9iYWNrKE5vZGUoKSk7Cgl9CgoJaW50IHVwZGF0ZShpbnQgcHJlLCBpbnQgbCwgaW50IHIsIGludCBwb3MsIGludCB2YWwpIHsKCQlpbnQgY3VyID0gc2VnLnNpemUoKTsgIAoJCXNlZy5wdXNoX2JhY2soc2VnW3ByZV0pOyAKCQlpZiAobCA9PSByKSB7CgkJCXNlZ1tjdXJdLnN1bSArPSB2YWw7IAoJCQlyZXR1cm4gY3VyOyAKCQl9CgkJaW50IG1pZCA9IChsICsgcikgPj4gMTsgCgkJaWYgKHBvcyA8PSBtaWQpIHsKCQkJc2VnW2N1cl0ubCA9IHVwZGF0ZShzZWdbcHJlXS5sLCBsLCBtaWQsIHBvcywgdmFsKTsgCgkJfQoJCWVsc2UgewoJCQlzZWdbY3VyXS5yID0gdXBkYXRlKHNlZ1twcmVdLnIsIG1pZCArIDEsIHIsIHBvcywgdmFsKTsgCgkJfQoJCWludCBsYyA9IHNlZ1tjdXJdLmwsIHJjID0gc2VnW2N1cl0ucjsgCgkJc2VnW2N1cl0uc3VtID0gc2VnW2xjXS5zdW0gKyBzZWdbcmNdLnN1bTsgCgkJcmV0dXJuIGN1cjsKCX0KCglpbnQgZ2V0S3RoKGludCBydCwgaW50IGwsIGludCByLCBpbnQgaykgewoJCWlmIChzZWdbcnRdLnN1bSA8IGspIHJldHVybiBuICsgMTsgCgkJaWYgKGwgPT0gcikgcmV0dXJuIGw7IAoJCWludCBtaWQgPSAobCArIHIpID4+IDE7IAoJCWludCBsYyA9IHNlZ1tydF0ubCwgcmMgPSBzZWdbcnRdLnI7IAoJCWlmIChrIDw9IHNlZ1tsY10uc3VtKSB7CgkJCXJldHVybiBnZXRLdGgobGMsIGwsIG1pZCwgayk7IAoJCX0KCQlyZXR1cm4gZ2V0S3RoKHJjLCBtaWQgKyAxLCByLCBrIC0gc2VnW2xjXS5zdW0pOyAKCX0KCglpbnQgdXBkYXRlKGludCBwcmUsIGludCBwb3MsIGludCB2YWwpIHsKCQlyZXR1cm4gdXBkYXRlKHByZSwgMSwgbiwgcG9zLCB2YWwpOyAKCX0KCglpbnQgZ2V0S3RoKGludCBydCwgaW50IGspIHsKCQlyZXR1cm4gZ2V0S3RoKHJ0LCAxLCBuLCBrKTsgCgl9Cn07CgppbnQgcm9vdFtOXTsgCgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbjsgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOyAKCglmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIGxhc3RbeF0gPSBuICsgMTsgCglmb3IgKGludCBpID0gbjsgaSA+PSAxOyBpLS0pIHsKCQlueHRbaV0gPSBsYXN0W2FbaV1dOyAgIAoJCWxhc3RbYVtpXV0gPSBpOyAgCgl9CgoJUGVyc2lzdGVudFNlZ1RyZWUgcHN0KG4pOyAKCWZvciAoaW50IGkgPSBuOyBpID49IDE7IGktLSkgewoJCXJvb3RbaV0gPSByb290W2kgKyAxXTsgCgkJcm9vdFtpXSA9IHBzdC51cGRhdGUocm9vdFtpXSwgaSwgMSk7CgkJaWYgKG54dFtpXSA8PSBuKSByb290W2ldID0gcHN0LnVwZGF0ZShyb290W2ldLCBueHRbaV0sIC0xKTsgCgl9CgoJZm9yIChpbnQgayA9IDE7IGsgPD0gbjsgaysrKSB7CgkJaW50IGFucyA9IDA7ICAKCQlpbnQgaSA9IDE7ICAKCQl3aGlsZSAoaSA8PSBuKSB7CgkJCWkgPSBwc3QuZ2V0S3RoKHJvb3RbaV0sIGsgKyAxKTsgCgkJCSsrYW5zOyAKCQl9CgkJY291dCA8PCBhbnMgPDwgJyAnOyAKCX0KfQ==