Cod sursa(job #2885501)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 6 aprilie 2022 10:02:02
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <ctype.h>
#define MAX_N 100000
int v[MAX_N], dp[MAX_N + 1], prev[MAX_N], rasp[MAX_N];
int main() {
    FILE *fin, *fout;
    int n, maxLen, len, m, p, st, dr, mij, i;
    fin = fopen( "scmax.in", "r" );
    fscanf( fin, "%d", &n );
    maxLen = 0;
    dp[0] = -1;
    for ( i = 0; i < n; i++ ) {
        fscanf( fin, "%d", &v[i] );
        st = 0;
        dr = maxLen + 1;
        while ( dr - st > 1 ) {
            mij = (st + dr) / 2;
            if ( v[dp[mij]] < v[i] )
                st = mij;
            else
                dr = mij;
        }
        len = st + 1;
        prev[i] = dp[st];
        if ( len > maxLen ) {
            maxLen = len;
            dp[len] = i;
        }
        else {
            if ( v[i] < v[dp[len]] )
                dp[len] = i;
        }
    }
    fclose( fin );
    fout = fopen( "scmax.out", "w" );
    fprintf( fout, "%d\n", maxLen );
    m = 0;
    p = dp[maxLen];
    while ( p != -1 ) {
        rasp[m] = v[p];
        m++;
        p = prev[p];
    }
    for ( i = m - 1; i >= 0; i-- )
        fprintf( fout, "%d ", rasp[i] );
    fclose( fout );
    return 0;
}