Pagini recente » Cod sursa (job #1877143) | Cod sursa (job #384868) | Cod sursa (job #538817) | Cod sursa (job #2786956) | Cod sursa (job #416124)
Cod sursa(job #416124)
#include<stdio.h>
#define maxn 100001
int best[ maxn ], v[maxn], who[ maxn], last[maxn];
int get_best( int a, int right)
{
int left = 1 ;
while( left != right)
{
int middle = (( left + right) >> 1);
if( a > best[middle])
{
left = middle + 1;
}
else right = middle;
}
return left;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n;
scanf("%d",&n);
best[ 0 ] = 0;
who[ 0 ] = 0;
int max = 1;
for( int i = 1; i <= n; ++i)
{
best[ i ] = 2000000000 + 1;
scanf("%d",&v[i]);
int p = get_best( v[i], max);
best[ p ] = v[i];
who[ p ] = i;
last[ i ] = who[ p - 1];
if( p == max) max++;
}
printf("%d\n", max - 1);
int a = who[max - 1];
int *sol = new int [max];
for(int i = max - 1; i >= 1; i--)
{
sol[ i ] = v[ a ];
a = last[ a ];
}
for(int i = 1; i < max - 1; ++i)
{
printf("%d ", sol[i]);
}
printf("%d\n",sol[max-1]);
return 0;
}