Cod sursa(job #2523882)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 14 ianuarie 2020 20:36:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

#define input "scmax.in"
#define output "scmax.out"
#define NMAX 100005

using namespace std;

ifstream in(input);
ofstream out(output);

int sir[NMAX], liss[NMAX], previ[NMAX], N, L, previ_pos[NMAX];

void Read_Data()
{
    in >> N;
    for(int i = 1; i <= N; i++)
        in >> sir[i];
}

int Binary_Search(int st, int dr, int x)
{
    int sol = 0;
    while(st <= dr)
    {
        int midd = (st + dr) / 2;
        if(liss[midd] <= x)
        {
            if(liss[midd] == x) sol = midd;
            else sol = midd + 1;
            st = midd + 1;
        }
        else dr = midd - 1;
    }
    return sol;
}

void Print_Sol(int x)
{
    if(previ[x]) Print_Sol(previ[x]);
    out << sir[x] << " ";
}

void Solve()
{
    liss[1] = sir[1], previ_pos[1] = 1;
    L = 1;
    for(int i = 2; i <= N; i++)
    {
        if(sir[i] < liss[1])
            liss[1] = sir[i], previ_pos[1] = i;
        else if(sir[i] > liss[L])
            previ[i] = previ_pos[L], liss[++L] = sir[i], previ_pos[L] = i;
        else
        {
            int poz = Binary_Search(1, L, sir[i]);
            previ[i] = previ_pos[poz - 1];
            liss[poz] = sir[i], previ_pos[poz] = i;
        }
    }
    out << L << "\n";



    Print_Sol(previ_pos[L]);
}

int main()
{
    Read_Data();
    Solve();
    return 0;
}