Cod sursa(job #2554095)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 22 februarie 2020 16:27:30
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>

using namespace std;

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

vector < int > v;
int a[100005], prec[100005], nr[100005], R[100005];

int main()
{
    int n, i, st, dr, mij, r, x;

    fin >> n;
    for ( i = 1 ; i <= n ; i++ ) fin >> a[i];

    v.push_back ( 1 );
    nr[1] = 1;
    for ( i = 2 ; i <= n ; i++ )
    {
        if ( a[i] > a[v[v.size()-1]] ) prec[i] = v[v.size()-1], nr[i] = nr[prec[i]] + 1, v.push_back ( i );
        else
        {
            st = 0;
            dr = v.size() - 1;
            r = dr;
            while ( st <= dr )
            {
                mij = ( st + dr ) / 2;
                if ( a[v[mij]] >= a[i] ) r = mij, dr = mij - 1;
                else st = mij + 1;
            }

            v[r] = i;
            if ( r == 0 ) prec[i] = -1, nr[i] = 1;
            else prec[i] = v[r-1], nr[i] = nr[prec[i]] + 1 ;
        }
    }

    fout << v.size() << '\n';

    for ( i = 1 ; i <= n ; i++ )
        if ( nr[i] == v.size() )
        {
            r = i;
            break;
        }

    i = 0;
    x = r;
    while ( x != -1 )
    {
        R[++i] = a[x];
        x = prec[x];
    }

    for ( i = v.size() ; i > 0 ; i-- ) fout << R[i] << ' ';

    return 0;
}