Cod sursa(job #2330520)

Utilizator andreistanStan Andrei andreistan Data 28 ianuarie 2019 16:01:45
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 100001;

int N, a[MAXN]; ///Datele de intrare
int L[MAXN]; ///L[i] = adresa primului element din sirul a
///                 pentru care subsirul care incepe
///                  cu acel element are lungimea i
int P[MAXN]; ///P[i] = pozitia elementului care urmeaza dupa a[i]
///                   in cel mai lung subsir crescator care incepe cu a[i]
///             P[i] = 0, daca un astfel de element nu exista.
int Lmax;    ///Lungimea maxima a unui subsir crescator

int cautare(int p, int u, int x)
{
    while(p <= u)
    {
        int m = (p + u) / 2;
        if(x < a[L[m]])
            p = m + 1;
        else
            u = m - 1;
    }
    return p;
}

void generare()
{
    for(int i = N; i > 0; i--)
    {
        int k = cautare(1, Lmax, a[i]);
        P[i] = L[k - 1];
        if(k > Lmax)
        {
            Lmax = k;
            L[k] = i;
        }
        else
            if(a[L[k]] < a[i])
                L[k] = i;
    }
}

void afisare()
{
    g << Lmax << '\n';
    for(int i = L[Lmax]; i > 0; i = P[i])
        g << a[i] << ' ';
}

int main()
{
    f >> N;
    for(int i = 1; i <= N; i++)
        f >> a[i];
    generare();
    afisare();
    return 0;
}