Cod sursa(job #300982)
#include<fstream>
#include<algorithm>
#define N 100001
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
long x[N],l[N],a[N],n;
void rd()
{
f>>n;
for(long i=1;i<=n;i++)
{
f>>x[i];
}
}
long cauta(int r,int n)
{
long s=1,d=n;
while(s<=d)
{
long m=(s+d)/2;
if(x[l[m]]>r&&x[l[m+1]]<r) return m;
if(x[l[m]]>r)
s=m+1;
else
d=m-1;
}
return 0;
}
void go()
{
a[n]=1;
l[1]=n;
long i,mx=1;
for(i=n-1;i;i--)
{
long pz=cauta(x[i],mx);
a[i]=pz+1;
l[pz+1]=i;
if(a[i]>mx) mx=a[i];
}
g<<mx<<"\n";
for(i=1;i<=n;i++)
if(a[i]==mx)
g<<x[i]<<" ",mx--;
}
int main()
{
rd();
go();
return 0;
}