Cod sursa(job #3033071)

Utilizator SarakottoBogudanSaracut Bogdan Andrei SarakottoBogudan Data 23 martie 2023 12:16:31
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector> 

using namespace std;

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

vector < long long > v;
vector < long long > poz;
vector < int > lung;

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

void afisare(int p, int val, int lg)
{
    if(lg == 0)
    {
        return;
    }
    if(v[p] <= val && lung[p] == lg)
    {
        afisare(p - 1, v[p] - 1, lg - 1);
        cout << v[p] << " ";
    }
    else 
    {
        afisare(p - 1, val, lg);
    }
}

int main()
{
    v.resize(100001);
    poz.resize(100001);
    lung.resize(100001);
    int n;
    cin >> n;
    for(int i = 1 ; i <= n; i++)
    {
        cin >> v[i];
    }
    int nr = 0, pmax = 1;
    for(int i = 1; i <= n; i++)
    {
        int l = caut_bin(poz, nr, v[i]);
        if(l == nr)
        {
            nr++;
        }
        poz[l + 1] = v[i];
        lung[i] = l + 1;
        if(lung[i] > lung[pmax])
        {
            pmax = i;
        }
    }
    cout << nr << '\n';
    afisare(pmax, v[pmax], lung[pmax]);
    return 0;
}