#include <bits/stdc++.h>
using namespace std;
struct node
{
	int p,l,r;
	int pre,adj,f,rk;
}a[110000];
int n;
int tmp[110000],b[110000];
vector<int> save[110000];
int num[110000];
int pre[110000],suf[110000];
int v[110000];
int sub[110000];
vector<int> g[110000];
int tot,cnt,cjb1,cjb2;
void init()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&tmp[i]);
		b[i]=tmp[i];
	}
	tot=0;
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++)if(b[i]!=b[i-1])b[++tot]=b[i];
	for(int i=1;i<=n;i++)tmp[i]=lower_bound(b+1,b+tot+1,tmp[i])-b;
	
	cnt=0;
	a[++cnt].p=tmp[1];
	a[cnt].l=a[cnt].r=1;
	a[cnt].adj=-1;
	for(int i=2;i<=n;i++)
	{
		if (tmp[i]==tmp[i-1]){ a[cnt].r++; continue; }
		a[++cnt].p=tmp[i];
		a[cnt].pre=0;
		a[cnt].l=a[cnt].r=i;
		if (tmp[i]==tmp[i-1]+1)a[cnt].adj=cnt-1; else a[cnt].adj=-1;
	}
	for(int i=1;i<=tot;i++)save[i].clear();
	for(int i=1;i<=tot;i++)num[i]=0;
	for(int i=1;i<=cnt;i++){ save[a[i].p].push_back(i); num[a[i].p]++; a[i].rk=num[a[i].p]; }
}
void dfs(int x)
{
	if (v[x])return;
	v[x]=1;
	cjb1=min(cjb1,a[x].l);
	cjb2=max(cjb2,a[x].r);
	int cntt=g[x].size();
	for(int i=0;i<cntt;i++)dfs(g[x][i]);
}
void work()
{

	
	
	for(int i=0;i<=num[1];i++)a[save[1][i]].f=0;
	for(int i=2;i<=tot;i++)
	{
		pre[0]=0;
		for(int j=1;j<=num[i-1];j++)pre[j]=max(pre[j-1],a[save[i-1][j-1]].f);
		suf[num[i-1]]=0;
		for(int j=num[i-1];j>=1;j--)suf[j]=max(suf[j+1],a[save[i-1][j-1]].f);
		
		for(int j=0;j<num[i];j++)
		{
			a[save[i][j]].f=pre[num[i-1]];
			
			if (a[save[i][j]].adj==-1)continue;
			
			int adj=a[save[i][j]].adj;
			int ff=max(pre[a[adj].rk-1],suf[a[adj].rk+1])+1;
			if (num[i-1]==1)ff=pre[num[i-1]]+1;
			if (ff>a[save[i][j]].f)a[save[i][j]].f=ff,a[save[i][j]].pre=1;
		}
	}
	
	/*
	for(int i=1;i<=cnt;i++)
	{
		printf("p=%d l=%d r=%d adj=%d rk=%d f=%d pre=%d\n",a[i].p,a[i].l,a[i].r,a[i].adj,a[i].rk,a[i].f,a[i].pre);
	}
	puts("");
	*/
	for(int i=1;i<=cnt;i++)g[i].clear();
	int used=-1;
	for(int i=tot;i>=2;i--)
	{
		int ans=-1,ansp;
		for(int j=0;j<num[i];j++)
			if (j!=used && ans<a[save[i][j]].f)ans=a[save[i][j]].f,ansp=j;
		//printf("%d\n",used);
		//printf("p=%d l=%d r=%d adj=%d rk=%d f=%d pre=%d\n",a[save[i][ansp]].p,a[save[i][ansp]].l,a[save[i][ansp]].r,a[save[i][ansp]].adj,a[save[i][ansp]].rk,a[save[i][ansp]].f,a[save[i][ansp]].pre);;
		if (a[save[i][ansp]].pre==1)
		{
			used=a[a[save[i][ansp]].adj].rk-1;
			g[a[save[i][ansp]].adj].push_back(save[i][ansp]);
			g[save[i][ansp]].push_back(a[save[i][ansp]].adj);
		}
		else used=-1;
		
		if (num[i-1]==1)used=-1;
	}
	
	int yzc=0;
	for(int i=1;i<=cnt;i++)v[i]=0;
	for(int i=1;i<=cnt;i++)
	if (!v[i])
	{
		cjb1=2147483647;
		cjb2=0;
		dfs(i);
		yzc++;
		sub[yzc]=cjb2-cjb1+1;		
	}
	printf("%d\n",yzc);
	for(int i=1;i<=yzc;i++)printf("%d%c",sub[i],i==yzc?'\n':' ');
}
int main()
{
	//freopen("1.in","r",stdin);
	init();
	work();
}
