Cod sursa(job #930571)
#include<stdio.h>
inline int max(int a , int b)
{
if(a > b)
return a;
return b;
}
int v[100001] , a[100001] , best[100001] , sol[100001];
int n , poz , maxim;
int cb(int val)
{
int st=1 , dr=v[0] , med;
while(st < dr)
{
med=(st + dr) >> 1;
if(v[med] < val)
st=med + 1;
else
dr=med;
}
return st;
}
int main()
{
freopen("scmax.in" , "r" , stdin);
freopen("scmax.out" , "w" , stdout);
scanf("%d" , &n);
for (int i=1 ; i<=n ; ++i)
scanf("%d" , &a[i]);
v[1]=a[1];
v[0]=1;
best[1]=1;
for (int i=2 ; i<=n ; ++i)
{
poz=cb(a[i]);
v[poz]=a[i];
best[i]=poz;
maxim=max(maxim , best[i]);
v[0]=max(v[0] , poz + 1);
//printf("%d " , best[i]);
}
printf("%d\n" , maxim);
for (int i=n ; i>=1 && maxim > 0 ; --i)
if(best[i] == maxim)
{
sol[++sol[0]]=a[i];
--maxim;
}
for (int i=sol[0] ; i>=1 ; --i)
printf("%d " , sol[i]);
return 0;
}