Cod sursa(job #2965885)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 16 ianuarie 2023 15:16:52
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

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

const int Nmax = 100001;
const int ValMax = 2000000000;

int v[Nmax], s[Nmax], prv[Nmax];

int binarySearch(int start, int finish, int index){
    int mid, sol;

    sol = -1;
    while(start <= finish){
        mid = (start + finish) / 2;

        if(v[index] <= v[s[mid]]){
            sol = mid;
            finish = mid - 1;
        }
        else{
            start = mid + 1;
        }
    }

    return sol;
}

void reconst(int poz){
    if(poz != -1){
        reconst(prv[poz]);

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

int main()
{
    int n, lenmax, index;

    fin >> n;

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

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

        index = binarySearch(0, lenmax, i);
        if(s[index] == Nmax - 1){
            lenmax++;
        }
        s[index] = i;

        if(index > 0){
            prv[i] = s[index - 1];
        }
        else{
            prv[i] = -1;
        }
    }

    fout << lenmax << '\n';

    reconst(s[lenmax - 1]);

    return 0;
}