Cod sursa(job #2685651)

Utilizator XeinIonel-Alexandru Culea Xein Data 17 decembrie 2020 14:59:30
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

#define NMAX 100001

std::ifstream f("scmax.in");
std::ofstream g("scmax.out");
int N, Arr[NMAX], Arr_Asc[NMAX], Prev[NMAX], Index[NMAX], Len = 1;

void Path(int i)
{
    if(Prev[i] != 0)
        Path(Prev[i]);
    g << Arr[i] << ' ';
}

int main()
{
    f >> N;
    for(int i = 1; i <= N; i++)
        f >> Arr[i];
    f.close();

    Arr_Asc[1] = Arr[1];
    Index[1] = 1;
    for(int i = 2; i <= N; i++)
    {
        if(Arr[i] > Arr_Asc[Len])
        {
            Arr_Asc[++Len] = Arr[i];
            Prev[i] = Index[Len - 1];
            Index[Len] = i;
        }
        else if(Arr[i] < Arr_Asc[1])
        {
            Arr_Asc[1] = Arr[i];
            Index[1] = i;
        }
        else
        {
            int l = 1, r = Len;
            while(l < r - 1)
            {
                int m = (l + r) / 2;
                if(Arr_Asc[m] >= Arr[i])
                    r = m;
                else
                    l = m;
            }
            if(Arr_Asc[r] != Arr[i])
            {
                Arr_Asc[r] = Arr[i];
                Prev[i] = Index[r - 1];
                Index[r] = i;
            }
        }
    }
    g << Len << '\n';
    Path(Index[Len]);
    return 0;
}