Cod sursa(job #2302161)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 13 decembrie 2018 21:21:48
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define NMAX 100000

int v[1 + NMAX], best[1 + NMAX], p[1 + NMAX], ans[1 + NMAX];

int cb ( int k, int m ) {
    int pas = ( 1 << 16 ), i = 1;

    while ( pas ) {
        if ( i + pas <= m && v[p[i + pas]] < k )
            i += pas;

        pas /= 2;
    }

    return i;
}

int main() {
    int n, l = 1;
    int i;

    FILE *fin = fopen ( "scmax.in", "r" );
    fscanf ( fin, "%d", &n );
    for ( i = 1; i <= n; i++ ) {
        fscanf ( fin, "%d", &v[i] );
        int j = cb ( v[i], l );
        best[i] = p[j];
        p[j + 1] = i;
        l += ( l == j );
    }
    fclose ( fin );

    int j = p[l];
    for ( i = l - 1; i >= 1; i-- ) {
        ans[i] = v[j];
        j = best[j];
    }

    FILE *fout = fopen ( "scmax.out", "w" );
    fprintf ( fout, "%d\n", l - 1 );
    for ( i = 1; i < l; i++ )
        fprintf ( fout, "%d ", ans[i] );
    fclose ( fout );

    return 0;
}