Cod sursa(job #609519)
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,i,x[100001],m[100001],p[100001],l,j,x2[100001],k,maxim;
int cautb(int v) {
int p,u,b;
p=0;u=l;b=(p+u)/2;
while (p<=u) {
if (x[m[b]]<x[v] && x[m[b+1]]>=x[v]) return b;
else if(x[m[b+1]]<x[v]) {p=b+1;b=(p+u)/2;}
else {u=b-1;b=(p+u)/2;}
}
return l;
}
void afis(int k) {
if (p[k]) afis(p[k]);
g << x[k] << ' ';
}
int main() {
f >> n;
for (i=1;i<=n;i++) f >> x[i];
l=0;
for (i=1;i<=n;i++) {
j=cautb(i);
p[i]=m[j];
if (j==l || x[i]<x[m[j+1]]) {
m[j+1]=i;
l=max(l,j+1);
x2[i]=j+1;
if (maxim<x2[i]) {maxim=x2[i];k=i;}
}
}
g << maxim << '\n';
afis(k);
g << '\n';
f.close();g.close();
return 0;
}