Cod sursa(job #2370029)

Utilizator levladutzVlad Iftode levladutz Data 6 martie 2019 10:22:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ( "scmax.in" );
ofstream fout ( "scmax.out" );
int dp[100001];
int a[100001];
int ant[100001];
int v[1000001];
int nr, n;
int caut ( int x )
{
    int lo = 0, hi = nr + 1, mid;

    while ( hi - lo > 1 )
    {
        mid = ( lo + hi ) / 2;

        if ( x > a[v[mid]] )
            lo = mid;
        else
            hi = mid;
    }

    return lo;
}
int main()
{
    fin >> n;

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

    dp[1] = 1;
    v[1] = 1;
    nr = 1;

    for ( int i = 2; i <= n; i++ )
    {
        int x = caut ( a[i] );

        if ( x + 1 > nr )
            nr++;

        dp[i] = x + 1;
        v[x + 1] = i;
        ant[i] = v[x];
    }

    int m = 0, imax;

    for ( int i = 1; i <= n; i++ )
        if ( dp[i] > m )
        {
            m = dp[i];
            imax = i;
        }

    fout << m << '\n';
    int x = imax;
    /*
        for ( int i = 1; i <= n; i++ )
            fout << ant[i] << ' ';
      */
    vector<int>sol;

    while ( x != 0 )
    {
        sol.push_back ( a[x] );
        x = ant[x];
    }

    for ( vector<int>::reverse_iterator it = sol.rbegin(); it != sol.rend(); it++ )
        fout << *it << ' ';


    return 0;
}