Cod sursa(job #2139687)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 22 februarie 2018 18:35:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int v[100005],L[100005],best[100005],p[100005],n,poz,maxim,nr;
void afis(int i)
{
    if(p[i]>0) afis(p[i]);
    cout<<v[i]<<' ';
}
int caut(int x)
{
    int p=0,u=nr,m;
    m=(p+u)/2;
    while(p<=u)
    {
        if(v[L[m]]<x && v[L[m+1]]>=x) return m;
        else if(v[L[m+1]]<x) {p=m+1; m=(p+u)/2;}
        else {u=m-1; m=(p+u)/2;}
    }
    return nr;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>v[i];
    cin.close();
    nr=1; best[1]=L[1]=1;
    for(int i=2;i<=n;i++)
    {
        poz=caut(v[i]);
        p[i]=L[poz];
        best[i]=poz+1;
        L[poz+1]=i;
        if(nr<poz+1) nr=poz+1;
    }
    for(int i=1;i<=n;i++)
    {
        if(maxim<best[i])
        {
            maxim=best[i];
            poz=i;
        }
    }
    cout<<maxim<<'\n';
    afis(poz);
    cout.close();
}