#include <bits/stdc++.h>
using namespace std;
#define SIZE(p)       (int)(p).size()
#define ALL(p)        (p).begin(),(p).end()
#define rep(i,n)      for(int i=0;i<(int)(n);++i)
#define FOR(i,a,b)    for(int i=(int)(a);i<=(int)(b);++i)
#define FORD(i,b,a)   for(int i=(int)(b);i>=(int)(a);--i)
const int inf=~0U>>1;
int main(){
  freopen("fragmentation.in","r",stdin);
  freopen("fragmentation.out","w",stdout);
  int n,m;scanf("%d",&n);
  static int a[100005],ap[100005];
  vector<int> av;
  FOR(i,1,n)scanf("%d",a+i),av.push_back(a[i]);
  sort(ALL(av));av.erase(unique(ALL(av)),av.end());
  for(int i=1,j,h=0;i<=n;){
    for(j=i;j<=n && a[j]==a[i];++j);
    ap[++h]=j-i,i=j;
  }
  n=unique(a+1,a+1+n)-a-1;m=av.size();  
  static vector<int> g[100005];
  static int cnt[100005];
  FOR(i,1,n){
    a[i]=(int)(lower_bound(ALL(av),a[i])-av.begin())+1;
    ++cnt[a[i]];
    if(i-1 && a[i-1]+1==a[i])
      g[a[i]].push_back(i);
  }
  auto badpos=[&](int x){    
    return x-1 && a[x-1]+1==a[x] && x-2 && a[x-2]+1==a[x-1] && cnt[a[x-1]]>1;
  };  
  using state=tuple<int,int,int>;
  static vector<state> dp[100005];  
  dp[1].push_back(state(0,0,0));
  FOR(i,2,m){    
    auto premax=[&](){return get<0>(dp[i-1][0]);};
    auto presmx=[&](){return dp[i-1].size()<2?-inf:get<0>(dp[i-1][1]);};
    dp[i].push_back(state(premax(),0,0));    
    for(int x:g[i]){
      //at position x      
      if(badpos(x) && get<1>(dp[i-1][0])==x-1)dp[i].push_back(state(presmx()-1,x,1));        
      else dp[i].push_back(state(premax()-1,x,0));        
    }
    sort(ALL(dp[i]));    
  }  
  static bool use[100005];
  for(int i=m,j=0;i;--i){//at state dp[i][j]    
    int x=get<1>(dp[i][j]);    
    if(x)use[x]=1;
    j=get<2>(dp[i][j]);
  }
  vector<int> rs;
  int sm=ap[1];
  for(int i=2;i<=n;++i){
    if(use[i])sm+=ap[i];
    else rs.push_back(sm),sm=ap[i];
  }rs.push_back(sm);
  printf("%d\n",SIZE(rs));
  rep(i,SIZE(rs))printf("%d%c",rs[i]," \n"[i+1==SIZE(rs)]);
  return 0;
}
