Cod sursa(job #2457827)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 18 septembrie 2019 20:29:22
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

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

    int n, l, b[100005], v[100005], m[100005], i, bn, k, aux;

    fin >> n;
    l = b[0] = v[0] =  m[0] = bn = 0;

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

        l = 0; k = bn;
        while(l <= k) {
            aux = (l + k) / 2;
            if(v[b[aux]] < v[i]) l = aux + 1;
            else if(v[b[aux]] > v[i]) k = aux - 1;
            else break;
        }

        if(l <= k) continue;
        b[l] = i;
        m[i] = l;

        if(bn < l) {
            bn = l;
        }
    }

    (fout << bn).put('\n');

    for(i = n, l = bn; i > 0; --i)
        if(m[i] == l)
            { b[l] = v[i]; break; }

    for(--l; i > 0 && l; --i)
        if(m[i] == l && v[i] < b[l+1])
            { b[l] = v[i]; --l; }
    
    for(i = 1; i <= bn; ++i)
        (fout << b[i]).put(' ');


}