Возрастающая подпоследовательность
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int n,m,i;
cin>>n;
vector<int> x(n);
for(i=0;i<n;++i)
cin>>x[i];
vector<int> b(n,-1);
vector<pair<int,int> > a;
for(i=0;i<n;++i)
{
m=lower_bound(a.begin(),a.end(),make_pair(x[i],0))-a.begin();
if(m==a.size())
a.push_back(make_pair(x[i],i));
else if(x[i]<a[m].first)
a[m]=make_pair(x[i],i);
else
continue;
if(m>0)
b[i]=a[m-1].second;
}
vector<int> r;
i=a.back().second;
while(i>=0)
{ r.push_back(x[i]);
i=b[i];
}
cout<<r.size()<<'\n';
for(i=r.size()-1;i>=0;--i)
cout<<r[i]<<(i>0?' ':'\n');
return 0;
}