Cod sursa(job #1171708)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 16 aprilie 2014 10:49:39
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<vector>

using namespace std;

ifstream fin( "scmax.in" );
ofstream fout( "scmax.out" );

const int nmax = 100000;
int p[ nmax + 1 ];
int a[ nmax + 1 ];
vector <int> v;

int main()
{
    int n, n2, sol, k;
    fin>>n;
    v.push_back( 0 );
    a[ 0 ] = 0;
    for( int i = 1; i <= n; ++ i ) {
        fin>>a[i];
        k = (int)v.size();
        for( n2 = 1; n2 * 2 <= k; n2 *= 2 ) {
        }
        sol = k - 1;
        for( int step = n2; step > 0; step /= 2 ) {
            if ( sol - step >= 0 && a[ v[ sol - step ] ] > a[i] ) {
                sol -= step;
            }
        }
        if ( a[i] > a[ v[ sol ] ] ) {
            v.push_back( i );
            p[i] = v[ k - 1 ];
        } else {
            v[ sol ] = i;
            p[ i ] = v[ sol - 1 ];
        }
    }
    fout<<v.size() - 1<<'\n';
    k = v.back();
    v.clear();
    while( k > 0 ) {
        v.push_back( k );
        k = p[ k ];
    }
    for( int i = (int)v.size() - 1; i >= 0; -- i ) {
        fout<<a[ v[i] ]<<' ';
    }
    fout<<'\n';
    fin.close();
    fout.close();
    return 0;
}