Cod sursa(job #3039422)

Utilizator dragoncrackCandidatu Mario Luca dragoncrack Data 28 martie 2023 15:54:32
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>

using namespace std;

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

int n, v[100001], w[100001], l[100001], k, poz, lmax, ant[100001], valori[100001], cnt;

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
    {
        fin >> v[i];
    }
    w[1] = 1;
    l[1] = 1;
    k = 1;
    for(int i = 2; i <= n; i++)
    {
        int st = 1;
        int dr = k;
        poz = 0;
        while(st <= dr)
        {
            int mid = (st + dr) / 2;
            if(v[i] <= v[w[mid]])
            {
                dr = mid - 1;
                poz = mid;
            }
            else
                st = mid + 1;
        }
        if(!poz)
        {
            ant[i] = w[k];
            w[++k] = i;
            l[i] = k;
        }
        else
        {
            ant[i] = w[poz - 1];
            w[poz] = i;
            l[i] = poz;
        }
        lmax = max(lmax, l[i]);
    }
    fout << lmax << "\n";
    for(int i = 1; i <= n; i++)
    {
        if(lmax == l[i])
        {
            poz = i;
            break;
        }
    }
    valori[++cnt] = v[poz];
    while(ant[poz])
    {
        poz = ant[poz];
        valori[++cnt] = v[poz];
    }
    for(int i = cnt; i > 0; i--)
        fout << valori[i] << " ";
}