Cod sursa(job #2531711)

Utilizator AndreeaGherghescuAndreea Gherghescu AndreeaGherghescu Data 26 ianuarie 2020 17:15:14
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>

using namespace std;

ifstream in ("scmax.in");
ofstream out ("scmax.out");

const int N=100001;
int v[N],best[N],p[N],ind[N],nr;

int cauta (int x)
{
    int p=0,u=nr,m=(p+u)/2;
    while (p<=u)
    {
        if (v[ind[m]]<x && x<=v[ind[m+1]]) return m;
        else if (v[ind[m+1]]<x) {p=m+1;m=(p+u)/2;}
        else {u=m-1;m=(p+u)/2;}
    }
    return nr;
}
void afis (int x)
{
    if (p[x]!=0) afis (p[x]);
    out<<v[x]<<' ';
}
int main()
{
    int n,maxx=0,poz;
    in>>n;
    for (int i=1;i<=n;i++)
        in>>v[i];
    best[1]=1;
    ind[1]=0;
    ind[0]=0;
    for (int i=2;i<=n;i++)
    {
        poz=cauta(v[i]);
        best[i]=poz+1;
        p[i]=ind[poz];
        ind[poz+1]=i;
        if (nr<poz+1) nr=poz+1;
    }
    for (int i=1;i<=n;i++)
        if (best[i]>maxx)
        {
            maxx=best[i];
            poz=i;
        }
    out<<maxx<<'\n';
    afis (poz);
    return 0;
}