Pagini recente » Cod sursa (job #314065) | Cod sursa (job #2901858) | Cod sursa (job #581031) | Cod sursa (job #2250851) | Cod sursa (job #1404883)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[100001],dp[100001],poz[100001],v[100001],len;
inline int Bsearch(int x){
int *p,poz;
if(x == dp[len]) return len;
else if(x > dp[len]) return len+1;
p = upper_bound(dp+1,dp+len+1,x);
poz = p - dp;
if(dp[poz-1] == x) return poz-1;
return poz;
}
inline int tell_me(int a[],int n){
int i,x,lg;
for(i=1;i<=n;i++)
dp[i]=poz[i]=0;
dp[1]=a[1];len = 1;poz[1]=1;
for(i=2;i<=n;i++){
x=Bsearch(a[i]);
dp[x]=a[i];
poz[i] = x;
if(x > len)len=x;
}lg=len;
for(i=n;i>0;i--)
if(poz[i]==lg){v[lg]=a[i];lg--;}
return len;
}
int main()
{
int i,big;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i = 1; i <= n;i++)
scanf("%d",&a[i]);
big = tell_me(a,n);
printf("%d\n",big);
for(i = 1; i <= big; ++i)
printf("%d ",v[i]);
printf("\n");
return 0;
}