Cod sursa(job #2700666)

Utilizator mihnea.cazan15mihnea cazan mihnea.cazan15 Data 28 ianuarie 2021 14:09:44
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>

using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int v[100001],l[100001],vmin[100001];
void subsir(int p)
{
    int i=p-1;
    while(i>=0&&(v[i]>=v[p]||l[i]!=l[p]-1))
          i--;
    if(i>=0)
       subsir(i);
    cout<<v[p]<<" ";
}
int main()
{
    int n,i,k,imax,st,dr,m,ans;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>v[i];
    l[0]=1;
    k=1;
    vmin[1]=v[0];
    imax=0;
    for(i=1;i<n;i++)
    {
        st=1;
        dr=k;
        ans=0;
        while(st<=dr)
        {
            m=(st+dr)/2;
            if(v[i]>vmin[m])
            {
                ans=m;
                st=m+1;
            }
            else
                dr=m-1;
        }
        if(ans)
        {
            if(ans==k)
               {
                   vmin[++k]=v[i];
                   imax=i;
               }
            else
                vmin[ans+1]=v[i];
        }
        else
        {
            if(v[i]<vmin[1])
               vmin[1]=v[i];
        }
        l[i]=ans+1;
    }
    cout<<l[imax]<<'\n';
    subsir(imax);
    return 0;
}