Cod sursa(job #2173879)

Utilizator chioreanraulChiorean Raul chioreanraul Data 16 martie 2018 09:21:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define val first
#define indice second
using namespace std;
int n,i,j,v[100005],ta[100005],poz;

pair < int, int > aranj[ 100005 ];
vector < int > mv;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int cautareb( int st, int dr )
{
    int mij = ( st + dr ) / 2;
    if( st <= dr )
    {
         if( aranj[ mij ].val < v[ i ] )
            return cautareb( mij + 1, dr );
         else
            return cautareb( st , mij - 1 );
    }
    return mij;
}
int main()
{
    fin>>n;
    for( i = 1; i <= n; i++ )
        fin>>v[ i ];
    aranj[ 1 ].val = v[ 1 ];
    aranj[ 1 ].indice = 1;
    ta[ 1 ] = 0;
    int lmax = 1;
    for( i = 2 ; i <= n; i++ )
    {
        poz = cautareb( 1 , lmax );
        if( poz == lmax )
        {
            lmax++;
        }
        aranj[ poz + 1 ].val = v[ i ];
        aranj[ poz + 1 ].indice = i;
        ta[ i ] = aranj[ poz ].indice;
    }
    fout<<lmax<<'\n';
    i = aranj[ lmax ].indice;
    while( i != 0 )
    {
        mv.push_back( v[ i ] );
        i = ta[ i ];
    }
    reverse( mv.begin( ), mv.end( ) );
    for( auto itmv : mv )
        fout<<itmv<<" ";
    return 0;
}