Cod sursa(job #2725692)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 19 martie 2021 15:40:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define NMAX 100005

using namespace std;

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

int v[NMAX];
int best[NMAX];///lungimea optima pana la poz i, cu i in subsir
int L[NMAX];
int r[NMAX];

void rec(int indice)
{
    if(r[indice]!=0)
        rec(r[indice]);
    out<<v[indice]<<' ';
}

int main()
{
    int n,m,maxim=-1,ind;
    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i];
    best[1]=1;
    L[1]=1;
    r[1]=0;
    m=1;
    maxim=1;
    ind=1;
    for(int i=2;i<=n;i++)
    {
        if(v[i]>v[L[m]])
        {
            best[i]=m+1;
            L[m+1]=i;
            r[i]=L[m++];
            if(best[i]>maxim)
            {
                maxim=best[i];
                ind=i;
            }
        }
        else
        {
            int st=1,dr=m,mij,poz=-1;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(v[L[mij]]<v[i])
                {
                    poz=mij;
                    st=mij+1;
                }
                else
                    dr=mij-1;
            }
            if(poz!=-1)
            {
                L[poz+1]=i;
                best[i]=poz+1;
                r[i]=L[poz];
            }
            else
            {
                best[i]=1;
                r[i]=0;
                L[1]=i;
            }
        }
    }
    out<<maxim<<'\n';
    rec(ind);
    return 0;
}