Cod sursa(job #2759147)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 15 iunie 2021 18:16:25
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <fstream>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

const int N = 1e5 + 1;
int n, v[N], dp[N], k, num[N], ans[N], aux;

int main(){
    f >> n;
    for(int i = 0; i < n; i++)
        f >> v[i];

    f.close();
    for(int i = 0; i < n; i++){
        if(v[i] > num[k]){
            num[++k] = v[i];
            dp[i] = k;
        }else{
            int st = 1, dr = k, m, poz = k + 1;
            while(st <= dr){
                m = (st + dr) / 2;
                if(num[m] >= v[i])
                    poz = m, dr = m - 1;
                else
                    st = m + 1;
            }

            num[poz] = v[i];
            dp[i] = poz;
        }
    }

    g << k << '\n';
    aux = k;
    for(int i = n; i >= 0; i--){
        if(dp[i] == aux)
            ans[aux--] = v[i];
    }

    for(int i = 1; i <= k; i++)
        g << ans[i] << ' ';

    g.close();
}