Cod sursa(job #2860468)

Utilizator norryna07Alexandru Norina norryna07 Data 2 martie 2022 17:39:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define N (int)1e5+5
using namespace std;

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

int n, a[N], l[N], best[N], t[N], nr;
///best[i] - cea mai mare pozitie pe care o poate ocupa i intr-un subsir sc 
/// t[i] - nodul aflat inaintea lui i in subsir

void citire()
{
    fin>>n;
    for (int i=1; i<=n; ++i) fin>>a[i];
    fin.close();
}

int caut(int x)
{
    int st=0, dr=nr;
    while (st<=dr)
    {
        int m=(st+dr)/2;
        if (a[l[m]]<x && x<=a[l[m+1]]) return m;
        else if (a[l[m+1]]<x) st=m+1;
             else dr=m-1;
    }
    return nr;
}

void precalculare()
{
    nr=1;
    best[1]=1; l[1]=1; l[0]=0;
    for (int i=2; i<=n; ++i)
    {
        int poz=caut(a[i]);
        t[i]=l[poz];
        best[i]=poz+1;
        l[poz+1]=i;
        if (nr<poz+1) nr=poz+1;
    }
}

void drum(int x)
{
    if (t[x]!=0) drum(t[x]);
    fout<<a[x]<<' ';
}

void afisare()
{
    int lgmax=-1;
    int x;
    for (int i=1; i<=n; ++i)
        if (lgmax<best[i])
        {
            lgmax=best[i]; x=i;
        }
    fout<<lgmax<<'\n';
    drum(x);

}

int main()
{
    citire();
    precalculare();
    afisare();
    return 0;
}