Cod sursa(job #1010850)

Utilizator Teodor94Teodor Plop Teodor94 Data 15 octombrie 2013 20:12:33
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <cassert>

#define MAX_N 100001

int v[MAX_N], len[MAX_N], pred[MAX_N];

void read( FILE *fin, int &n ) {
    assert( fscanf( fin, "%d", &n ) == 1 );
    for ( int i = 1; i <= n; ++i )
        assert( fscanf( fin, "%d", &v[i] ) == 1 );
}

void write( FILE *fout, int i ) {
    if ( i == 0 )
        return;

    write( fout, pred[i] );

    fprintf( fout, "%d ", v[i] );
}

int binary_search( int x, int nr ) {
    int i, pas = 1 << 16;

    for ( i = 0; pas; pas >>= 1 )
        if ( i + pas <= nr && v[len[i + pas]] < x )
            i += pas;

    return i + 1;
}

void solve( FILE *fout, int n ) {
    int nr = 1;
    len[1] = 1;

    for ( int i = 2; i <= n; ++i ) {
        int j = binary_search( v[i], nr );

        if ( j == nr + 1 )
            ++nr;

        len[j] = i;

        if ( j != 1 )
            pred[i] = len[j - 1];
        else
            pred[i] = 0;
    }

    fprintf( fout, "%d\n", nr );
    write( fout, len[nr] );
}

int main() {
    FILE *fin, *fout;
    
    fin = fopen( "scmax.in", "r" );
    int n;
    read( fin, n );
    fclose( fin );
    
    fout = fopen( "scmax.out", "w" );
    solve( fout, n );
    fclose( fout );
}