Cod sursa(job #3039454)

Utilizator Bianca2507Negret Bianca Bianca2507 Data 28 martie 2023 16:26:11
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>

using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n,i,v[100005],w[100005],j,st,dr,mid,lmax,poz,k,l[100005],y[100005],k1;
int poz1,ant[100005];
int main()
{
    cin>>n;
    for(i=1; i<=n; i++)
        cin>>v[i];
    l[1]=lmax=1;
    w[++k]=1;
    for(i=2; i<=n; i++)
    {
        st=1;
        dr=k;
        poz=0;
        while(st<=dr)
        {
            mid=(st+dr)/2;
            if(v[i]<=v[w[mid]])
            {
                poz=mid;
                dr=mid-1;
            }
            else
                st=mid+1;
        }

        if(poz==0)
            ant[i]=w[k],w[++k]=i,l[i]=k;
        else
            ant[i]=w[poz-1],l[i]=poz,w[poz]=i;

        lmax=max(lmax,l[i]);
    }
    for(i=1; i<=n; i++)
        if(l[i]==lmax)
        {
            poz1=i;
            break;
        }
    y[++k1]=v[poz1];
    while(ant[poz1]!=0)
    {
        poz1=ant[poz1];
        y[++k1]=v[poz1];
    }

    cout<<lmax<<'\n';
    for(i=k1; i>=1; i--)
        cout<<y[i]<<" ";
    return 0;
}