Cod sursa(job #2970752)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 25 ianuarie 2023 20:32:00
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

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

const int Nmax = 100000;
const int ValMax = 2000000000;

int lensol;
int v[Nmax + 1], best[Nmax], previ[Nmax];

void reconst(int poz){
    if(previ[poz] == -1){
        fout << v[poz] << " ";
        return;
    }

    reconst(previ[poz]);

    fout << v[poz] << " ";
}

int main()
{
    int n, sol, l ,r ,mid;

    fin >> n;

    for(int i = 0; i < Nmax; i++){
        best[i] = Nmax;
    }
    v[Nmax] = ValMax;

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

        l = 0;
        r = lensol;
        sol = 0;
        while(l <= r){
            mid = (l + r) / 2;

            if(v[i] <= v[best[mid]]){
                sol = mid;
                r = mid - 1;
            }
            else{
                l = mid + 1;
            }
        }
        best[sol] = i;
        if(sol == 0){
            previ[i] = -1;
        }
        else{
            previ[i] = best[sol - 1];
        }
        if(sol == lensol){
            lensol++;
        }
    }

    fout << lensol << '\n';

    reconst(n - 1);

    return 0;
}