Cod sursa(job #1116936)

Utilizator PatrikStepan Patrik Patrik Data 22 februarie 2014 21:55:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
    #include<cstdio>
    using namespace std;
    #define MAX 100001
    int N , v[MAX] , l[MAX] , p[MAX]  , nr  , k;

    void cauta(int x);

    int main()
    {
        freopen("scmax.in" , "r" , stdin );
        freopen("scmax.out" , "w" , stdout );
        scanf("%d" , &N );
        for(int i = 1 ; i <= N ; ++i )
            scanf("%d" , &v[i] );

        l[1] = v[1];
        p[1] = nr = 1;
        for(int i = 2 ; i <= N ; ++i )
        {
            if(v[i] > l[nr])
            {
                l[++nr] = v[i];
                k = nr;
            }
            else
                cauta(v[i]);
            p[i] = k;
        }
        printf("%d\n" , nr);
        int aux = nr;
        for(int i = N ; i ; i--)
            if(p[i] == aux)
                l[aux--] = v[i];
        for(int i = 1 ; i <= nr ; ++i )
            printf("%d " , l[i]);
        return 0;
    }

    void cauta(int x)
    {
        int ls , ld , m;
        ls = 0;ld = nr;
        while(ls <=ld)
        {
            m = (ls+ld)/2;
            if(l[m] < x && x <= l[m+1])
            {
                l[m+1] = x;
                k = m+1;
                return;
            }
            else
                if(l[m] < x)ls = m+1;
                else ld = m;
        }
    }