Cod sursa(job #2205029)

Utilizator DordeDorde Matei Dorde Data 17 mai 2018 18:32:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define pb push_back
using namespace std;
int const NM = 1e5 + 7;
int v [NM] , v1 [NM], v2 [NM];
vector <int> sol;
inline int bsearch (int a , int n)
{
    int m , from , to , found = 1;
    from = 1;
    to = n;
    while(from <= to)
    {
        m = (from + to) >> 1;
        if(v1 [m] >= a)
            found = m , to = m - 1;
        else
            from = m + 1;
    }
    return found;
}
char const in [] = "scmax.in";
char const out [] = "scmax.out";
ifstream cin (in);
ofstream cout (out);
int main ()
{
    int n , i , j , k = 0 ;
    cin >> n;
    for(i = 1 ; i <= n ; ++ i)
        cin >> v [i];
    for(i = 1 ; i <= n ; ++ i)
    {
        if(! k)
            v1 [++ k] = v [i] , v2 [i] = 1;
        else
        {
            if(v1 [k] < v [i])
                v1 [++ k] = v [i] , v2 [i] = k;
            else
            {
                int pos = bsearch (v [i] , k);
                v2 [i] = pos;
                v1 [pos] = v [i];
            }
        }
    }
    pair <int , int> mx;
    for(i = n ; i >= 1 ; -- i)
        if( v2 [i] > mx . first)
            mx . first = v2 [i] , mx . second = i;
    cout << mx . first << '\n' ;
    sol . pb (v [mx . second]);
    for(i = mx . second ; i >= 1 ; -- i)
    {
        if( v2 [i] == mx . first - 1)
        {
            -- mx . first;
            sol . pb (v [i]);
        }
    }
    reverse (sol . begin () , sol . end ());
    for(i = 0 ; i < sol . size () ; ++ i)
        cout << sol [i] << ' ' ;
    return 0;
}