Cod sursa(job #914180)

Utilizator PatrikStepan Patrik Patrik Data 13 martie 2013 22:15:43
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
    #include<cstdio>
    using namespace std;
    #define MAX 100001
    #define INF 2000000001
    int N , V[MAX] , Q[MAX] , P[MAX] , T[MAX] ,maxim  , nr ;

    void citire();
    void solve();
    void tipar();
    void insert(int x , int ls , int ld);
    void drum(int x,int i);

    int main()
    {
        citire();
        solve();
        tipar();
        return 0;
    }

    void citire()
    {
        freopen("scmax.in" , "r" , stdin );
        scanf("%d" , &N);
        for( int i = 1 ; i <= N ; ++i )
            scanf("%d" , &V[i]);
    }

    void solve()
    {
        Q[1] = V[1] ;
        P[1] = nr = 1;
        for(int i = 2 ; i <= N ; ++i )
        {
          if(V[i] > Q[nr])
              Q[++nr] = V[i];
          else insert(V[i],0,nr);
          P[i] = nr;
          if(nr > maxim)maxim = nr;
        }
    }

    void insert(int x ,int ls , int ld )
    {
       int m;
       while(ls <= ld)
       {
            m = (ls+ld)/2;
            if(x > Q[m] && x <= Q[m+1])
            {
                Q[m+1] = x;
                return;
            }
            else
            if(x <= Q[m])ld = m;
            else ls = m+1;
       }
    }

    void tipar()
    {
        freopen("scmax.out" , "w" , stdout);
        printf("%d\n" , maxim);
        int j = maxim , i;
        for(i = N ;j; i--)
            if(P[i] == j)
                j--;
        for(i++,j++;j<=maxim;++i)
            if(P[i] == j)
            {
                printf("%d " , V[i]);
                j++;
            }
    }