Cod sursa(job #2072637)

Utilizator FredyLup Lucia Fredy Data 21 noiembrie 2017 23:52:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 100010
#define inf 2e9
int ini[lim], dp[lim], dad[lim], n, rez, lmax;

/// returneaza cea mai din dreapta pozitie cu valoarea < val
int b_s (int val)
{
    int mask, pos;
    for (mask=1; mask<=lmax; mask<<=1);
    for (pos=0; mask; mask>>=1)
        if (pos+mask<=lmax && ini[dp[pos+mask]]<val)
            pos+=mask;
    return pos;
}

void drum (int nod)
{
    if (dad[nod])   drum (dad[nod]);
    fout<<ini[nod]<<' ';
}


int main()
{
    fin>>n;
    for (int i=1; i<=n; i++)
        fin>>ini[i];
    ini[0]=inf;

    for (int i=1; i<=n; i++)
    {
        int pos = b_s (ini[i]);
        lmax = max (lmax, pos+1);
        dp[pos+1]=i;
        dad[i] = dp[pos];
    }

    fout<<lmax<<'\n';
    drum(dp[lmax]);

    fout.close();
    return 0;
}