Cod sursa(job #2144573)

Utilizator sebistetuCucolas Sebastian sebistetu Data 26 februarie 2018 20:16:26
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#include<stack>
#include<climits>

using namespace std;

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

const int Nmax = 100005;
const int Inf = INT_MAX;

int Lungime[Nmax], Tata[Nmax], V[Nmax], LungimeMaxima, N, Index, Copie;

stack<int>Stiva;

inline void Citire(){

    f >> N;
    for(Index = 1; Index <= N; ++Index)
        f >> V[Index];
}

inline void CautareBinara(int Valoare, int Pozitie){

    ++LungimeMaxima;

    int IndiceStanga, IndiceDreapta, Mijloc;

    IndiceStanga = 1;
    IndiceDreapta = LungimeMaxima;

    while(IndiceStanga != IndiceDreapta){

        Mijloc = (IndiceStanga + IndiceDreapta) >> 1;

        if(Valoare > Lungime[Mijloc])
            IndiceStanga = Mijloc + 1;
        else
            IndiceDreapta = Mijloc;
    }

    Lungime[IndiceDreapta] = Valoare;
    Tata[Pozitie] = IndiceDreapta;

    if(Lungime[LungimeMaxima] == Inf)
        --LungimeMaxima;
}

inline void Rezovare(){

    for(Index = 1; Index <= N; ++Index)
        Lungime[Index] = Inf;

    ++LungimeMaxima;
    Tata[1] = 1;
    Lungime[1] = V[1];

    for(Index = 2; Index <= N; ++Index)
        CautareBinara(V[Index], Index);

    Copie = LungimeMaxima;

    for(Index = N; Index >= 1; --Index)
        if(Tata[Index] == Copie){

            Stiva.push(V[Index]);
            --Copie;
        }
}

inline void Printare(){

    g << LungimeMaxima << '\n';

    while(!Stiva.empty()){

        g << Stiva.top() << ' ';
        Stiva.pop();
    }
}

int main(){

    Citire();
    Rezovare();
    Printare();
    return 0;
}