Cod sursa(job #2306400)

Utilizator hiperlucarioTudor Mihnea hiperlucario Data 22 decembrie 2018 11:53:56
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int VALMAX = 2e+9;

int lungc, submax, n, v[100002], ml[100002], rez[100002], lungmax[100002];

int cb(int val, int pozmax)
{
    int st, dr, med, last;

    st = 1;
    dr = pozmax;
    last = 0;

    while (st <= dr)
    {
        med = (st + dr) / 2;

        if (ml[med] < val)
        {
            last = med;
            st = med + 1;
        }
        else dr = med - 1;
    }

    return last;
}

int main()
{
    fin>>n;

    for (int i=1; i<=n; i++)
    {
        fin>>v[i];
        ml[i] = VALMAX + 1;
    }

    for (int i=1; i<=n; i++)
    {
        lungc = cb(v[i], submax);

        if (ml[lungc+1] > v[i]) ml[lungc+1] = v[i];

        lungmax[i] = lungc + 1;

        if (lungc+1 > submax) submax = lungc+1;
    }

    int lelemc = submax, nr = 0;

    for (int i=n; i>=1; i--)
        if (lelemc == lungmax[i])
        {
            rez[++nr] = v[i];

            lelemc--;
        }

    fout<<submax<<"\n";

    for (int i=nr; i>=1; i--)
        fout<<rez[i]<<" ";

    return 0;
}