#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
;
struct nod
{
int best,val,pos;
};
nod aint[400001];
vector<pair<int,int>>a;
bool compare(pair<int,int>a,pair<int,int>b)
{
return (a.first<b.first || (a.first==b.first && a.second<b.second));
}
void update(int v,int st,int dr,int pos,nod rasp)
{
if(st==dr)
aint[v]=rasp;
else
{
int mid=(st+dr)/2;
if(pos<=mid)
update(v*2,st,mid,pos,rasp);
else update(v*2+1,mid+1,dr,pos,rasp);
if(aint[v*2].best>aint[v*2+1].best)
aint[v]=aint[v*2];
else if(aint[v*2+1].best>aint[v*2].best)
aint[v]=aint[v*2+1];
else
{
aint[v]=aint[v*2];
aint[v].val=min(aint[v].val,aint[v*2+1].val);
}
}
}
int best,val,pos;
void query(int v,int st,int dr,int qst,int qdr)
{
if(qst<=st && qdr>=dr)
{
if(aint[v].best>best)
{
best=aint[v].best;
val=aint[v].val;
pos=aint[v].pos;
}
else if(aint[v].best==best && aint[v].val<val)
{
val=aint[v].val;
pos=aint[v].pos;
}
}
else
{
int mid=(st+dr)/2;
if(qst<=mid)
query(v*2,st,mid,qst,qdr);
if(qdr>mid)
query(v*2+1,mid+1,dr,qst,qdr);
}
}
vector<pair<int,int>>ans;
int main()
{
int n,x,lmax=0;
fin>>n;
for(int i=1; i<=n; i++)
{
fin>>x;
a.push_back({x,i});
}
sort(a.begin(),a.end(),compare);
for(int i=0; i<n; i++)
{
best=0;
val=2e9+1;
query(1,1,n,1,a[i].second);
if(a[i].first==val && val)
best--;
update(1,1,n,a[i].second, {best+1,a[i].first,a[i].second});
lmax=max(best+1,lmax);
}
fout<<lmax<<'\n';
vector<pair<int,int>>ans;
for(int i=lmax; i>=1; i--)
{
best=0;
val=2e9+1;
pos=1e6;
if(i==lmax)
query(1,1,n,1,n);
else
query(1,1,n,1,ans[ans.size()-1].second-1);
if(i!=lmax)
while(val==ans[ans.size()-1].first)
{
val=0;
int cpy=pos;
pos=1e6;
query(1,1,n,1,cpy-1);
}
ans.push_back({val,pos});
}
reverse(ans.begin(),ans.end());
for(int i=0; i<ans.size(); i++)
fout<<ans[i].first<<" ";
return 0;
}