Cod sursa(job #269800)

Utilizator raula_sanChis Raoul raula_san Data 3 martie 2009 13:50:57
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>

#define MAX_N 100001

int A[MAX_N], P[MAX_N], Q[MAX_N], Sol[MAX_N];
int N, M;

int BinarySearch(int v)
{
    int p, i;
    for ( p = 1; p <= M; p <<= 1 );
    
    for ( i = 0; p; p >>= 1 )
        if(i + p <= M && A[i+p] <= v)
             i += p;

    if(A[i] != v)
            ++ i;
    return i;
}

int main()
{
    freopen("scmax.in", "rt", stdin);
    freopen("scmax.out", "wt", stdout);
    
    int i;
    for ( scanf("%d", &N), i = 1; i <= N; ++i )
        scanf("%d", A+i);

    for ( i = 1; i <= N; ++i )
    {
        if(A[i] > Q[M])
        {
                Q[++M] = A[i];
                P[i] = M;
        }
        else
        {
            int j = BinarySearch(A[i]);
            Q[j] = A[i];
            P[i] = j;
        }
    }

    printf("%d\n", M);
    
    int k = M;
    for ( i = N; i >= 1 && M; --i )
        if(P[i] == M)
                Sol[M--] = A[i];

    for ( i = 1; i <= k; ++i )
        printf("%d ", Sol[i]);
    
    fclose(stdin);
    fclose(stdout);
    return 0;
}