Cod sursa(job #2858502)

Utilizator ioana.cCaprariu Ioana ioana.c Data 27 februarie 2022 18:19:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>

using namespace std;

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

int n, a[100001], dp[100001], lmax, p[100001], s[100001];

int cautbin(int x){
    int p=1, u=lmax, mij, poz=lmax;
    while(p <= u){
        mij = (p+u)/2;
        if(dp[mij] >= x){
            poz = mij;
            u = mij - 1;
        }
        else{
            //poz = mij;
            p = mij + 1;
        }
    }
    return poz;
}

int main(){
    fin >> n;
    for(int i=1; i<=n; i++)
        fin >> a[i];
    lmax = 1;
    dp[1] = a[1];
    for(int i=2; i<=n; i++){
        if(a[i] > dp[lmax]){
            //fout <<lmax << ' '<<dp[lmax]<<' ';
            lmax++;
            dp[lmax] = a[i];
            p[i] = lmax;
           // fout << dp[lmax] << ' '<< a[i] << '\n';
        }
        else{
            int poz = cautbin(a[i]);
            dp[poz] = a[i];
            p[i] = poz;
        }
        /*fout << lmax << '\n';
        for(int i=1; i<=lmax; i++)
            fout << dp[i]<<' ';
        fout << '\n';*/
    }
    fout << lmax << '\n';
    int j = n;
    for(int i=lmax; i>=1; i--){
        while(p[j]!=i && j>1)
            j--;
        s[i] = a[j];
    }
    for(int i=1; i<=lmax; i++)
        fout << s[i] << ' ';
}