Cod sursa(job #1345686)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 17 februarie 2015 20:01:11
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

FILE *fin = fopen( "scmax.in", "r" ), *fout = fopen( "scmax.out", "w" );

const int nmax = 100000;
int val[ nmax + 1 ];
vector <int> aux;
int n, d[ nmax + 1 ], aib[ nmax + 1 ], v[ nmax + 1 ], r[ nmax + 1 ];

void update( int pos, int x ) {
    for( int i = pos; i <= n; i += (i & -i) ) {
        if ( d[ aib[ i ] ] < d[ x ] ) {
            aib[ i ] = x;
        }
    }
}
int query( int val ) {
    int sol = 0;
    for( int i = val; i > 0; i -= (i & -i) ) {
        if ( d[ sol ] < d[ aib[ i ] ] ) {
            sol = aib[ i ];
        }
    }
    return sol;
}
void normalizare() {
    sort( aux.begin(), aux.end() );
    aux.resize( unique( aux.begin(), aux.end() ) - aux.begin() );
    for( int i = 1; i <= n; ++ i ) {
        v[ i ] = lower_bound( aux.begin(), aux.end(), val[ i ] ) - aux.begin() + 1;
    }
}
int main() {
    int ans;
    fscanf( fin, "%d", &n );
    ans = 0;
    for( int i = 1; i <= n; ++ i ) {
        fscanf( fin, "%d", &val[ i ] );
        aux.push_back( val[ i ] );
    }
    normalizare();
    for( int i = 1; i <= n; ++ i ) {
        r[ i ] = query( v[ i ] - 1 );
        d[ i ] = d[ r[ i ] ] + 1;
        update( v[ i ], i );

        if ( d[ i ] > d[ ans ] ) {
            ans = i;
        }
    }
    fprintf( fout, "%d\n", d[ ans ] );
    aux.clear();
    while ( ans ) {
        aux.push_back( val[ ans ] );
        ans = r[ ans ];
    }
    for( int i = ( int )aux.size() - 1; i >= 0; -- i ) {
        fprintf( fout, "%d ", aux[ i ] );
    }
    fprintf( fout, "\n" );
    fclose( fin );
    fclose( fout );
    return 0;
}