Cod sursa(job #2570875)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 4 martie 2020 19:46:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n,a[100005],best[100005],lp[100005],k,p[100005],loc,sol;
int cauta(int x)
{
    int ans=0;
    int l=1,r=k;
    while(l<=r)
    {
        int m=(l+r)>>1;
        if(a[lp[m]]<x)
        {
            ans=max(ans,m);
            l=m+1;
        }
        else r=m-1;
    }
    return ans;
}
void afisare(int poz)
{
    if(p[poz]!=0) afisare(p[poz]);
    out<<a[poz]<<" ";
}
int main()
{
    in>>n;
    for(int i=1;i<=n;i++) in>>a[i];
    best[1]=1;
    lp[1]=1;
    p[1]=0;
    k=1;
    for(int i=2;i<=n;i++)
    {
        int poz=cauta(a[i]);
        best[i]=poz+1;
        p[i]=lp[poz];
        lp[poz+1]=i;
        if(poz+1>k) k=poz+1;
    }
    for(int i=1;i<=n;i++)
        if(best[i]>sol)
    {
        sol=best[i];
        loc=i;
    }
    out<<sol<<'\n';
    afisare(loc);
    return 0;
}