Cod sursa(job #3174434)

Utilizator VespaOlaru Amelia Vespa Data 24 noiembrie 2023 19:17:55
Problema Subsir crescator maximal Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n,v[100005];
int l[100005],poz[100005];

int cb(int x,int st,int dr)///cel mai mic nr mai mare decat x
{
    int rez=1;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(l[mij]>=x)
            dr=mij-1,rez=mij;
        else if(l[mij]<x)
            st=mij+1;
    }
    return rez;
}

int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)cin>>v[i];

    l[1]=v[1];
    int li=1;
    poz[1]=1;

    for(int i=2; i<=n; i++)
    {
        if(v[i]>l[li])///continua subsirul
        {
            l[++li]=v[i];
            poz[i]=li;
        }
        else if(v[i]<l[li])
        {
            int poz1=cb(v[i],1,li);///
            l[poz1]=v[i];
            poz[i]=poz1;

        }
    }
    cout<<li<<'\n';
    int sol[105],k=0;
    int aux=10000000;
    int pozmax=li;
    for(int i=n;i>=1;i--)
    {
        if(poz[i]==pozmax && aux>v[i])
        {
            pozmax--;
            //cout<<v[i]<<" ";
            sol[k++]=v[i];
        }
    }

for(int i=k-1;i>=0;i--)
    cout<<sol[i]<<" ";


    return 0;
}