Cod sursa(job #1251674)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 29 octombrie 2014 19:34:52
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>
#include <vector>


int main()
{
    std::ifstream fin("scmax.in");
    std::ofstream fout("scmax.out");

    int N;
    fin >> N;

    std::vector<int> v(N);
    for (int i = 0; i < N; ++i)
        fin >> v[i];
    fin.close();

    std::vector<int> P(N);
    std::vector<int> M(N+1);
    int L = 0;

    for (int i = 0; i < N; ++i) {
        int lo = 1;
        int hi = L;

        while (lo <= hi) {
            int mid = lo + (hi - lo)/2;
            if (v[M[mid]] < v[i])
                lo = mid + 1;
            else
                hi = mid - 1;
        }

        P[i] = M[lo - 1];
        M[lo] = i;

        if (lo > L)
            L = lo;
    }

    std::vector<int> seq(L);
    int k = M[L];
    for (int i = L - 1; i >= 0; --i) {
        seq[i] = v[k];
        k = P[k];
    }

    fout << L << "\n";
    for (auto &i : seq)
        fout << i << " ";

    fout.close();
    return 0;
}