Cod sursa(job #2041923)

Utilizator BourucLiviuBouruc Petru Liviu BourucLiviu Data 17 octombrie 2017 21:18:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>

#define N 100005

using namespace std;

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

int n, v[N], ant[N], sol[N], L;

int BS(int x)
{
    int st, dr, mij;
    st = 1; dr = L;
    while(st <= dr)
    {
        mij = (st+dr) / 2;
        if(v[sol[mij]] < x) st = mij+1;
        else dr = mij-1;
    }
    return st;
}

inline void afisare(int i)
{
    if(i)
    {
        afisare(ant[i]);
        fout << v[i] << " ";
    }
}

void SCM()
{
    int newL;
    for(int i = 1; i <= n; ++i)
    {
        newL = BS(v[i]);
        ant[i] = sol[newL-1];
        sol[newL] = i;
        if(newL > L) L = newL;
    }
    fout << L << '\n';
    afisare(sol[L]);
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; ++i) fin >> v[i];
    fin.close();
    SCM();
    fout.close();
    return 0;
}