//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
static const int NMAX = 1e5+5;
int ind[NMAX];
int v[NMAX];
int previous[NMAX];
int n;
int sz =0;
void ConstructSubstring()
{
for(int i =1; i<=n; ++i)
{
if(v[i] > v[ind[sz]])
{
ind[++sz] = i;
previous[i] = ind[sz-1];
}
else
{
int low = 1, high = sz, mid, sol=1;
while(low <= high)
{
mid = low + (high - low) /2;
if(v[i] <= v[ind[mid]])
{
sol = mid;
high = mid -1;
}
else
{
low = mid+1;
}
}
ind[sol] = i;
previous[i] = ind[sol-1];
}
}
}
int main()
{
fin >> n;
for(int i =1; i<=n; ++i)
{
fin >> v[i];
}
ConstructSubstring();
vector<int> sol;
int x = ind[sz];
while(x)
{
sol.push_back(v[x]);
x = previous[x];
}
fout << sz << '\n';
for(int i = (int) sol.size() - 1; i>= 0; i--)
{
fout << sol[i] << " ";
}
return 0;
}