Cod sursa(job #2966838)

Utilizator 55andreiv55Andrei Voicu 55andreiv55 Data 18 ianuarie 2023 16:10:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;
const int N = 1e5 + 1;

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

int x[N], lung[N], valmin[N];

void refs(int p, int val, int l)
{
    if (l == 1)
        return;
    if (x[p] < val && lung[p] == l - 1)
    {
        refs(p - 1, x[p], lung[p]);
        out << x[p] << " ";
    }
    else
        refs(p - 1, val, l);
}

int caut_bin(int v[N], int n, int val)
{
    int st = 1, dr = n, rez = 0;
    while (st <= dr)
    {
        int m = (st + dr) / 2;
        if (v[m] < val)
        {
            rez = m;
            st = m + 1;
        }
        else
            dr = m - 1;
    }
    return rez;
}

int main()
{
    int n, pmax = 1;
    in >> n;
    int nvalm = 0;
    for (int i = 1; i <= n; i++)
    {
        in >> x[i];
        int jz = caut_bin(valmin, nvalm, x[i]);
        if (jz == nvalm)
            nvalm++;
        lung[i] = 1 + jz;
        valmin[1 + jz] = x[i];
        if (lung[i] > lung[pmax])
            pmax = i;
    }
    in.close();
    out << lung[pmax] << "\n";
    refs(pmax, x[pmax] + 1, lung[pmax] + 1);
    out.close();
    return 0;
}