Cod sursa(job #2539104)

Utilizator AndreeaGherghescuAndreea Gherghescu AndreeaGherghescu Data 5 februarie 2020 17:11:22
Problema Subsir crescator maximal Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

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

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

int bs (long long x)
{
    int st=0,dr=nr,m=(st+dr)/2;
    while (st<=dr)
    {
        if (v[ind[m]]<x && v[ind[m+1]]>=x) return m;
        else if (x<v[ind[m]])
        {
            dr=m-1;
            m=(st+dr)/2;
        }
        else if (x>v[ind[m]])
        {
            st=m+1;
            m=(st+dr)/2;
        }
    }
    return nr;
}
void afis (int i)
{
    if (prec[i]) afis(prec[i]);
    out<<v[i]<<' ';
}
int main()
{
    int n,poz,maxx=0;
    in>>n;
    for (int i=1;i<=n;i++)
        in>>v[i];
    best[1]=1;
    ind[1]=0;
    for (int i=2;i<=n;i++)
    {
        poz=bs(v[i]);
        best[i]=poz+1; //in cel mai bun caz sta pe pozitia poz+1 in cmlsc
        prec[i]=ind[poz]; //indicele elementului dinainte de v[i]
        ind[poz+1]=i; //indicele elementului de pe pozitia poz+1
        if (nr<poz+1) nr=poz+1;
    }
    int ret;
    for (int i=1;i<=n;i++)
        if (best[i]>maxx)
        {
            maxx=best[i];
            ret=i;
        }
    out<<maxx<<'\n';
    afis (ret);
    return 0;
}