Pagini recente » Cod sursa (job #2041586) | Cod sursa (job #2327826) | Cod sursa (job #1862407) | Cod sursa (job #105012) | Cod sursa (job #2300799)
#include <cstdio>
#define MAXN 100000
using namespace std;
int v[MAXN+5], best[MAXN+5], p[MAXN+5], ans[MAXN+5];
/*
best[i] = pozitia celui mai mare element < v[i]
p[i] = pozitia in vectorul initial pentru al i-ulea element din sirul scmax
*/
int cb( int k, int m )
{
int pas=(1<<16), i=1;
while( pas )
{
if( i+pas<=m && v[p[i+pas]]<k )
i+=pas;
pas/=2;
}
return i;
}
int main()
{
freopen( "scmax.in", "r", stdin );
freopen( "scmax.out", "w", stdout );
int n, l=1;
scanf( "%d", &n );
for( int i=1;i<=n;i++ )
{
scanf( "%d", &v[i] );
int j=cb(v[i],l);
best[i]=p[j];
p[j+1]=i;
l+=(l==j);
}
printf( "%d\n", l-1 );
int j=p[l];
for( int i=l-1;i>=1;i-- )
{
ans[i]=v[j];
j=best[j];
}
for( int i=1;i<l;i++ )
printf( "%d ", ans[i] );
return 0;
}