Cod sursa(job #2868969)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 11 martie 2022 11:56:12
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>

using namespace std;

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

using ll = long long;
const int NMAX(100005);
int v[NMAX], nr, scm[NMAX], dUnd[NMAX], rez[NMAX];

inline void adauga(int val, int pz){
    if(scm[nr] < val){
        scm[++nr] = val;
        dUnd[pz] = nr;
        return;
    }
    int step = 1;
    for(; step <= nr; step <<= 1);
    step >>= 1;
    int best = 0;
    for(; step; step >>= 1)
        if(best + step <= nr && scm[best + step] < val)
            best += step;
    ++best;
    scm[best] = val;
    dUnd[pz] = best;
}

int main()
{
    int n;
    fin >> n;

    for(int i = 1; i <= n; ++i){
        fin >> v[i];
        adauga(v[i], i);
    }

    int elem = n;
    for(int i = nr; i >= 1; --i){
        while(dUnd[elem] != i)
            --elem;
        rez[i] = v[elem];
    }

    fout << nr << '\n';
    for(int i = 1; i <= nr; ++i)
        fout << rez[i] << ' ';
    return 0;
}