Cod sursa(job #2569171)

Utilizator VladAdrianaVlad Adriana VladAdriana Data 4 martie 2020 11:22:39
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,poz,nr,v[100005],l[100005],best[100005],p[100005],afis[100005];
int cb(int x)
{
    int st=0, dr=nr, mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(v[l[mij]]<x && v[l[mij+1]]>=x) return mij;
        else if(v[l[mij]]<x) st=mij+1;
        else dr=mij-1;
    }
    return nr;
}
int main()
{
    int i;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    best[1]=l[1]=1;
    nr=1;
    ///best[i] = lungimea max a unui sc care se termina cu i
    ///l = indicii elem din sir
    ///p = indicele elem precedent
    for(i=2;i<=n;i++)
    {
        poz=cb(v[i]);
        p[i]=l[poz];
        best[i]=poz+1;
        l[poz+1]=i;
        nr=max(nr,poz+1);
    }
    int maxi=poz=0;
    for(i=1;i<=n;i++)
        if(maxi<best[i]) {maxi=best[i], poz=i;}
    fout<<maxi<<'\n';
    int len=maxi;
    for(i=poz;p[i];i=p[i]) afis[--maxi]=v[i];
    afis[0]=v[i];
    for(i=0;i<len;i++) fout<<afis[i]<<' ';
    return 0;
}