Cod sursa(job #2002903)

Utilizator DavidLDavid Lauran DavidL Data 21 iulie 2017 10:40:08
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define MAX 100001
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");

int n,v[MAX],dp[MAX],prec[MAX],L[MAX],nr;

void afisare(int poz)
{
    if (prec[poz]>0)
        afisare(prec[poz]);
    fo<<v[poz]<<" ";
}

int cautare_binara(int x)
{
    int st=0,dr=nr+1;
    while (dr-st>1)
    {
        int mij=(st+dr)/2;
        if (x>=v[L[mij]])
            st=mij;
        else
            dr=mij;
    }
    if (v[L[st]]==x)
        st--;
    if (v[L[st]]<x&&v[L[st+1]]>=x)
        return st;
    return nr;
}

int main()
{
    fi.sync_with_stdio(false);
    fo.sync_with_stdio(false);
    ///v[]=numerele, prec[]=indicele elem. precedent,
    ///dp[]=lungimea maxima, L[]=?
    fi>>n;
    for (int i=1; i<=n; i++)
        fi>>v[i];
    dp[1]=L[1]=1;
    L[0]=0;
    nr=1;
    for (int i=2; i<=n; i++)
    {
        int poz=cautare_binara(v[i]);
        prec[i]=L[poz];
        dp[i]=poz+1;
        L[poz+1]=i;
        nr=max(nr,poz+1);
    }
    int maxim=0,poz=0;
    for (int i=1; i<=n; i++)
        if (dp[i]>maxim)
            maxim=dp[i],poz=i;
    fo<<maxim<<"\n";
    afisare(poz);

    fi.close();
    fo.close();
    return 0;
}