Cod sursa(job #416124)

Utilizator marius135Dumitran Adrian Marius marius135 Data 12 martie 2010 10:57:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#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;
}