Cod sursa(job #3320848)

Utilizator CimpoesuFabianCimpoesu Fabian George CimpoesuFabian Data 7 noiembrie 2025 16:25:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n, dp[100001], a[100001], b[100001], pos[100001];

/**
dp[i] = Cea mai mica valoare cu care se termina un subsir cresc.
        de lungime i

pos[i] = Pozitia la care am pus a[i] in vectorul dp

24 12 15 15 19 14 11

dp[1] = 11  pos[1] = 1
dp[2] = 14  pos[2] = 1
dp[3] = 19  pos[3] = 2
            pos[4] = 2
            pos[5] = 3
            pos[6] = 2
            pos[7] = 1
*/

int CautBin(int x, int n)
{
    int st = 1, dr = n, mij, poz;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (dp[mij] >= x)
        {
            poz = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    return poz;
}

int main()
{
    int i, k = 1, p, ok, val, k2;
    fin >> n;
    for (i = 1 ; i <= n ; i++)
        fin >> a[i];
    dp[1] = a[1];
    pos[1] = 1;
    for (i = 2 ; i <= n ; i++)
    {
        if (a[i] <= dp[k])
        {
            p = CautBin(a[i], k);
            dp[p] = a[i];
            pos[i] = p;
        }
        else
        {
            dp[++k] = a[i];
            pos[i] = k;
        }
    }
    k2 = k;
    fout << k << "\n";
    ok = 1;
    for (i = 1 ; i <= n && ok == 1 ; i++)
        if (pos[i] == k)
        {
            p = i;
            ok = 0;
        }
    val = a[p]; b[k] = a[p];
    for (i = p - 1 ; i >= 1 ; i--)
        if(a[i] < val && pos[i] == k - 1)
    {
        val = a[i];
        b[--k] = a[i];
    }
    for (i = 1 ; i <= k2 ; i++)
        fout << b[i] << " ";
    return 0;
}