Cod sursa(job #2794251)

Utilizator Matei_PanzariuMatei Panzariu Matei_Panzariu Data 4 noiembrie 2021 16:00:58
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include<fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int nr,lg[100002],v[100002],n,pre[100002];
void cautare(int x,int k)
{
    int st=1,m;
    int dr=x;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(v[lg[m]]>v[k])
            st=m+1;
        else
            dr=m-1;
    }
    if(v[lg[m]]>v[k])
    {
        lg[m+1]=k;
        pre[k]=lg[m];
        if(nr==m)
            nr++;
    }
    else
    if(v[lg[m]]<v[k])
        lg[m]=k,pre[k]=lg[m-1];
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    pre[n]=0;
    lg[1]=n;
    nr=1;
    for(int i=n-1;i>=1;i--)
        cautare(nr,i);
    cout<<nr<<'\n';
    int x=lg[nr];
    while(pre[x])
    {
        cout<<v[x]<<' ';
        x=pre[x];
    }
    cout<<v[x];
}