Cod sursa(job #2855223)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 22 februarie 2022 11:12:53
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <deque>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>

#define MOD 104659

using namespace std ;

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

/// 11:00

vector<int> dq, fin ;

int pozitii[100009], v[100009] ;

void recur(int poz, int f)
{
    if(poz < 0 || !f)return ;

    while(f && pozitii[f] != poz)
        f -- ;

    fin.push_back(v[f]) ;

    recur(poz - 1, f - 1) ;
}

int main()
{
    int n ;

    cin >> n ;

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

    for(int f = 1 ; f <= n ; f ++)
    {
        if(!dq.size() || v[f] > dq.back())
            dq.push_back(v[f]), pozitii[f] = dq.size() - 1 ;
        else
        {
            int poz_cb = (upper_bound(dq.begin(), dq.end(), v[f]) - dq.begin()) ;

            dq[poz_cb] = v[f] ;

            pozitii[f] = poz_cb ;
        }
    }

    cout << dq.size() << endl ;

    recur(dq.size() - 1, n) ;

    reverse(fin.begin(), fin.end()) ;

    for(int f = 0 ; f < fin.size() ; f ++)
        cout << fin[f] << " " ;

    return 0 ;
}