#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n;
int nr[100100];
int dp[100100];
int intru[100100];
int poz[100100];
const int inf = 1e9;
void caut_bin(int val, int pos) {
int st = 1, dr = n;
int ans = 0;
while (st <= dr) {
int mij = (st + dr) / 2;
if (mij > n) break;
if (dp[mij] != 0 && nr[dp[mij]] < val) {
ans = mij;
st = mij + 1;
} else {
dr = mij - 1;
}
}
int lung = ans + 1;
dp[lung] = pos;
intru[pos] = dp[ans];
poz[pos] = lung;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> nr[i];
}
for (int i = 1; i <= n; i++) {
caut_bin(nr[i], i);
}
int maxlen = 0;
for (int i = n; i >= 1; i--) {
if (poz[i] > maxlen) {
maxlen = poz[i];
}
}
cout << maxlen << '\n';
vector<int> sol;
int curr = dp[maxlen];
while (curr != 0) {
sol.push_back(nr[curr]);
curr = intru[curr];
}
reverse(sol.begin(), sol.end());
for (int x : sol) {
cout << x << ' ';
}
cout << '\n';
return 0;
}