Cod sursa(job #2787798)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 24 octombrie 2021 01:09:22
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>

using namespace std;

const int N = 100000;
int last [ N ], v [ N ], s [ N ], secv [ N ];

int main( ) {
    
    ifstream fin ( "scmax.in" );
    ofstream fout ( "scmax.out" );
    
    int n, i, st, dr, mij, k;
    
    fin >> n;
    
    for ( i = 0; i < n; i++ )
        fin >> v[ i ];
    
    last [ 0 ] = v [ 0 ];
    k = 1;
    
    for ( i = 1; i < n; i++ ){
        
        st = 0;
        dr = k;
        
        while ( dr - st > 1 ){
            
            mij = ( dr + st ) / 2 ;
            
            if( last [ mij ] < v [ i ] )
                st = mij;
            
            else
                dr = mij;
            
        }
        
        if ( v [ i ] <= last [ st ] ){
            last [ st ] = v [ i ];
            s [ i ] = st;
        }
        
        else{
            last [ st + 1 ] = v [ i ];
            s [ i ] = st + 1;
            if ( st == k - 1 )
                k++;
        }
        
    }
    
    fout << k << "\n";
    
    st = k;
    i = n - 1;
    k--;
    
    while ( v[ i ] != last [ k ] )
        i--;
    
    secv [ k ] = v[ i ];
    k--;
    
    while ( i >= 0 ){
        
        if ( v[ i ] < last [ k + 1 ] && s[ i ] == k ){
            secv [ k ] = v[ i ];
            k--;
        }
        
        i--;
    }
    
    for ( i = 0; i < st; i++ )
        fout << secv [ i ] << " ";
    
    return 0;
}