Cod sursa(job #3174446)

Utilizator VespaOlaru Amelia Vespa Data 24 noiembrie 2023 19:29:12
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <climits>
//#include <iostream>

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[100005],k=0;
    int aux=INT_MAX;
    int pozmax=li;
    for(int i=n; i>=1; i--)
    {
        if(poz[i]==pozmax)
        {
            while(aux<v[i])
                i--;
            if(poz[i]==pozmax)
            {
                pozmax--;
                //cout<<v[i]<<" ";
                sol[k++]=v[i];
                aux=v[i];
            }
        }
    }

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


    return 0;
}