Cod sursa(job #3355974)

Utilizator Rizi_SanNen Ioana Madlena Rizi_San Data 28 mai 2026 09:16:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
///variant nlog n
#include <fstream>
#include <algorithm>

using namespace std;

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

const int NMAX = 1e5;

int n, v[NMAX+2];
int lung[NMAX+2], val_min[NMAX+2], cnt, sol[NMAX+2];

int caut_bin(int x_i)
{
    int st = 1, dr = cnt, rez = st - 1;
    while (st <= dr) {
        int m = (st + dr) / 2;
        if (val_min[m] < x_i) {
            rez = m;
            st = m + 1;
        } else {
            dr = m - 1;
        }
    }
    return rez;
}

int main()
{
    in>>n;
    for (int i=1; i<=n; i++)
    {

        in>>v[i];
    }
    int pmax = 0;
    for (int i=1; i<=n; i++)
    {

        int k = caut_bin(v[i]);
        lung[i] = 1+k;

        if (k== cnt )
        {
            cnt++;
            val_min[cnt] = v[i];
        }
        else
        {
            val_min[k+1] = v[i];
        }
        if (lung[i] > lung[pmax]) {
            pmax = i;
        }
    }

    //out<<lung[pmax]<<endl;
    int ant = v[pmax] + 1;
    cnt=0;
    for (int i=n; i>=1; i--)
    {
        if (lung[pmax] == lung[i] && ant > v[i])
        {
            cnt++;
            sol[cnt] = v[i];
            ant = v[i];
            lung[pmax]--;
        }
    }

    out<<cnt<<"\n";
    for (int i=cnt; i>=1; i--)
    {
        out<<sol[i]<<" ";
    }
    return 0;
}