Cod sursa(job #3210006)

Utilizator LORDENVraja Luca LORDEN Data 4 martie 2024 12:15:29
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <algorithm>

using namespace std ;

ifstream cin ("scmax.in") ;
ofstream cout ("scmax.out") ;

const int dim = 100000 ;

int n, v[dim + 2], dp[dim + 2], pos[dim + 2], best[dim + 2], idx = 1 ;

void out (int start)
{

    if (pos[start] > 0)
        out(pos[start]) ;

    cout << v[start] << ' ' ;

}

int b_search (int x)
{
    int l = 0, r = idx, mid ;

    while (l <= r)
    {

        mid = (l + r) / 2 ;

        if (v[dp[mid]] < x &&  v[dp[mid + 1]] >= x)
            return mid ;

        else if (v[mid + 1] < x)
            l = mid + 1 ;

        else
            r = mid - 1 ;
    }

    return idx ;

}


int main()
{

    int start, max1 = -1 ;

    cin >> n ;

    for (int i = 1 ; i <= n ; i ++)
        cin >> v[i] ;

    best[1] = dp[1] = 1 ;

    for (int i = 2 ; i <= n ; i ++)
    {

        int p = b_search (v[i]) ;

        pos[i] = dp[p] ;
        best[i] = p + 1 ;
        dp[p + 1] = i ;

        if (idx < p + 1)
            idx = p + 1 ;

    }

    for (int i = 1 ; i <= n ; i ++)
        if (best[i] > max1)
            max1 = best[i], start = i ;

    cout << max1 << '\n' ;

    out(start) ;

    return 0 ;

}