Cod sursa(job #2121656)

Utilizator FredyLup Lucia Fredy Data 4 februarie 2018 00:16:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 100010
int n, ini[lim], rez, pos;
int dp[lim], dad[lim];  /// dp[i] = indicele el. care e capatul scmax de lungime i

/// returneaza cea mai din dr pos pt care ini[dp[pos]] < ini[x]
int b_s (int x)
{
    int pos, mask;
    for (mask=1; mask<=x; mask<<=1);
    for (pos=0; mask>0; mask>>=1)
        if (pos+mask<=x)
            if (ini[dp[pos+mask]] < ini[x]) pos+=mask;
    return pos;
}

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

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

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

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

    fout.close();
    return 0;
}