Cod sursa(job #2805829)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 02:18:42
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#define N 100002

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

int lg[N], sol[N], nr, v[N], pred[N];

void afis(int poz)
{
    if (poz)
    {
        afis(pred[poz]);
        g << v[poz] << ' ';
    }
}
int dinamica(int x)
{
    if (nr == 0 || v[sol[nr]] < x)
    {
        ++nr;
        return nr;
    }
    else
    {
        int st = 1, dr = nr, mij;
        int poz = 0;///NU UITA de initializarea asta!!!!
        while (st <= dr)
        {
            mij = (st + dr) / 2;
            if (v[sol[mij]] < x)
                poz = mij, st = mij + 1;
            else
                dr = mij - 1;
        }
        return poz + 1;
    }
}
int main()
{

    int n, x, poz, ma = 0, st;
    f >> n;
    for (int i = 1;i <= n;++i)
    {
        f >> x, v[i] = x;
        poz = dinamica(x);
        sol[poz] = i;
        lg[i] = lg[sol[poz - 1]] + 1;
        pred[i] = sol[poz - 1];
        if (lg[i] > ma)
            ma = lg[i], st = i;

    }
    g << ma << "\n";
    afis(st);
    f.close();
    g.close();
    return 0;
}