Cod sursa(job #886673)
#include <cstdio>
#define FIN "scmax.in","r",stdin
#define FOUT "scmax.out","w",stdout
using namespace std;
int n,i,pos,lg,j;
int a[100001],bst[100001],poz[100001];
int search(int x)
{
int p=1,u=lg,m;
while(p<=u)
{
m=(p+u)/2;
if(bst[m]>=x && bst[m-1]<=x)return m;
if(bst[m-1]<x)p=m+1;
else u=m-1;
}
return ++lg;
}
int main()
{
freopen(FIN);
scanf("%d",&n);
for(i=1;i<=n;i++){scanf("%d",&a[i]);bst[i]=2000000000;}
for(i=1;i<=n;i++)
{
pos=search(a[i]);
bst[pos]=a[i];
poz[i]=pos;
}
printf("%d\n",lg);
for(i=1;i<=lg;i++)
{
for(j=n;j>=1;j--)
if(poz[j]==i)
{
printf("%d ",a[j]);
break;
}
}
return 0;
}