Cod sursa(job #2976327)

Utilizator Samoila_AlexandruSamoilaAlexandru Samoila_Alexandru Data 8 februarie 2023 22:43:47
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;

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

const int nMax=1e5+5;

int n, v[nMax], d[nMax], poz[nMax], p[nMax], k;

void dp()
{
    k=1;
    d[k]=v[1];
    p[k]=1;

    for(int i=2; i<=n; i++)
    {
        if(d[k]<v[i])
            d[++k]=v[i], p[i]=k;
        else
        {
            int st=1, dr=k, pozGasit=k+1;

            while(st<=dr)
            {
                int m=(st+dr)/2;
                if(v[i]<=d[m])
                    pozGasit=m, dr=m-1;
                else st=m+1;
            }

            d[pozGasit]=v[i];
            p[i]=pozGasit;
        }
    }

    int j=n;
    for(int i=k; i>=1; i--)
    {
        while(p[j]!=i)
            j--;
        poz[i]=j;
    }
}

void afisare()
{
    for(int i=1; i<=k; i++)
        fout<<v[poz[i]]<<' ';
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);

    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>v[i];
    fin.close();

    dp();
    fout<<k<<'\n';
    afisare();

    fout.close();

    return 0;
}