Cod sursa(job #219074)
#include <cstdio>
#include <vector>
using namespace std;
const int N = 100001;
int n;
int x[N], m[N], p[N];
int main() {
freopen("scmax.in","rt",stdin);
freopen("scmax.out","wt",stdout);
scanf("%d",&n);
for (int i = 1; i <= n; ++i)
scanf("%d",&x[i]);
int max = 0;
m[0] = 0;
for (int i = 1; i <= n; ++i) {
int j = 0;
for (int step = 1 << 17; step; step >>= 1)
if (j+step <= max && x[m[j+step]] < x[i])
j += step;
p[i] = m[j];
if (j == max || x[i] < x[m[j+1]]) {
m[j+1] = i;
if (j+1 > max)
max = j+1;
}
}
printf("%d\n",max);
vector<int> rez;
for (int i = m[max]; i; i = p[i])
rez.push_back(x[i]);
for (int i = rez.size()-1; i >= 0; --i)
printf("%d ",rez[i]);
printf("\n");
return 0;
}