Pagini recente » Cod sursa (job #2999202) | Cod sursa (job #2066191) | Cod sursa (job #1588655) | Cod sursa (job #618641) | Cod sursa (job #1590373)
#include <cstdio>
#include <iostream>
using namespace std;
#define dim 100005
int v[dim], best[dim], elem[dim], poz[dim];
void afis( int i )
{
if (poz[i] > 0) afis(poz[i]);
printf("%d ",v[i]);
}
int caut( int k, int dr ){
int i = 0;
int pas = (1<<17);
while( pas ){
if( i + pas <= dr && v[elem[i+pas]] < k ) i += pas;
pas /= 2;
}
return i;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n, i, j, t, k, ma;
scanf("%d",&n);
for( i = 1; i <= n; ++i )
scanf("%d",&v[i]);
best[1] = elem[1] = ma = 1;
for( i = 2; i <= n; ++i ){
k = caut( v[i], ma );
poz[i] = elem[k];
elem[k+1] = i;
best[i] = k + 1;
if( k + 1 > ma ) ma++;
}
ma = 0;
for( i = 1; i <= n; ++i ){
if( ma < best[i] ){
ma = best[i];
k = i;
}
}
printf("%d\n",ma);
afis(k);
return 0;
}