Cod sursa(job #3123383)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 23 aprilie 2023 13:33:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

const int NMAX = 1e5;
int n, m, a[NMAX + 5];
int d_ind[NMAX + 5], indD;
int previ_ind[NMAX + 5];
int rez[NMAX + 5], indrez;

int CB(int value)
{
    int st = 1, dr = indD, poz = 0;
    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if (a[d_ind[mij]] >= value)
            poz = mij, dr = mij - 1;
        else
            st = mij + 1;
    }
    return poz;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 1; i <= n; i++)
    {
        if (a[i] > a[d_ind[indD]])
        {
            previ_ind[i] = d_ind[indD];
            d_ind[++indD] = i;
        }
        else
        {
            int poz = CB(a[i]);
            previ_ind[i] = d_ind[poz - 1];
            d_ind[poz] = i;
        }
    }

    indrez = indD;
    for (int i = d_ind[indD]; i > 0; i = previ_ind[i], indrez--)
        rez[indrez] = a[i];

    cout << indD << '\n';
    for (int i = 1; i <= indD; i++)
        cout << rez[i] << ' ';


    return 0;
}