#include <bits/stdc++.h>
using namespace std;
#define pb push_back
ifstream f("scmax.in");
ofstream g("scmax.out");
const int N = 1e5+3;
int n, v[N], prv[N], idx[N];
vector<int> dp;
int main()
{
f >> n;
for (int i = 1; i <= n; i++){
f >> v[i];
auto it = lower_bound(dp.begin(), dp.end(), v[i]);
if (it == dp.end()){
int k = dp.size();
dp.pb(v[i]);
prv[i] = idx[k-1];
idx[k] = i;
}
else {
*it = v[i];
int k = it - dp.begin();
prv[i] = idx[k-1];
idx[k] = i;
}
}
int k = dp.size();
g << k << '\n'; k--;
int last = idx[k];
stack<int> stk;
while (k >= 0){
stk.push(v[last]);
last = prv[last];
k--;
}
while (!stk.empty()) {g << stk.top() << ' '; stk.pop();}
return 0;
}