#include using namespace std; //#include //using namespace atcoder; using ll = long long; using pp = pair; #define rep(i, n) for (i = 0; (i) < (n); ++(i)) #define reps(i, a, n) for (i = (a); (i) < (n); ++(i)) #define rrep(i, n) for (i = (n-1); (i) >= (0); --(i)) #define all(a) (a).begin(), (a).end() #define oor(a,b,h,w) (a<0||a>=h||b<0||b>=w)//out of range #define fi first #define se second #define mkpr(a,b) make_pair(a,b) #define mktpl(a,b,c) make_tuple(a,b,c) #define fixp(a) fixed< dx={1,0,-1,0};//{1,1,0,-1,-1,-1,0,1}; vector dy={0,-1,0,1};//{0,-1,-1,-1,0,1,1,1}; //ll keta_calc(ll x){ll ans=0;while(x){x/=10;ans++;}return ans;} //ll powll(ll x,ll y){ll ans=1;while(y){ans*=x;y--;}return ans;} //alias g++='g++ -std=c++17' #define chmin(a,b) a=min(a,(b)) #define chmax(a,b) a=max(a,(b)) int n; bool solve(int mid, int b , vector &a){ int i=0,j,k; vector f(n,false); while(i mid){ break; } f[ a[j] ] = true; } if(cnt > mid){ break; } j++; } reps(k,i,j){ f[a[k]] = false; } b--; i=j; if(b==0)break; } if(i >= n){ return true; }else{ return false; } } int main(){ int i=0,j=0,k; cin >> n ; vector a(n),b; rep(i,n){ cin >> a[i]; a[i]--; } //分割数 b.push_back(n+1); rep(i,sqrt(n)+1){ int ok=n;int ng=0; // 種類数 while(abs(ok-ng)>1){ int mid = (ok+ng)/2; if(solve(mid,i+1, a)){ ok = mid; }else{ ng = mid; } } b.push_back(ok); } // rep(i,b.size()){ // cout << b[i] << " "; // }cout << endl; int ki; rep(ki,n){ vector f(n,false); int z = 0; i=0; while(i ki+1){ break; } f[ a[j] ] = true; } if(cnt > ki+1){ break; } j++; } reps(k,i,j){ f[a[k]] = false; } i=j; z++; } cout << z << "\n"; if(z <= b.size()){ break; } } ki++;ki++; rrep(i,b.size()-1){ // cout << ki << " " << b[i] << endl; reps(j,ki,b[i]){ cout << i+1 << "\n"; } ki = b[i]; } //sort(aitem.begin(),aitem.end(), //[](const vector &alpha,const vector &beta){return alpha[1] < beta[1];}); // cout << n << endl ; //if(flag==0)printf("Yes\n"); //else printf("No\n"); return 0; }