Cod sursa(job #2246773)

Utilizator alexge50alexX AleX alexge50 Data 27 septembrie 2018 15:42:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <algorithm>
#include <fstream>
#include <vector>


using IntVector = std::vector<int>;
using Pair = std::pair<int, int>;
using PairVector = std::vector<Pair>;

int binarySearch(const PairVector &v, int x)
{
    int step = 1 << 15;
    int r = 0;

    while(step)
    {
        if(r + step < v.size() && v[r + step].first < x)
            r += step;
        step /= 2;
    }

    return r;
}

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

    PairVector minTable;
    IntVector v;
    IntVector previous;
    int n;
    fin >> n;

    previous.insert(previous.end(), static_cast<unsigned long>(n + 1), 0);

    v.push_back(0);
    minTable.push_back(Pair{0, 0});
    for(int i = 1; i <= n; i++)
    {
        int x;

        fin >> x;
        v.push_back(x);

        auto j = binarySearch(minTable, x);

        previous[i] = minTable[j].second;

        if(j + 1 == minTable.size())
            minTable.emplace_back(x, i);
        else minTable[j + 1] = Pair{x, i};
    }

    std::ofstream fout("scmax.out");
    fout << minTable.size() - 1 << std::endl;

    IntVector values;

    auto p = minTable[minTable.size() - 1].second;

    while(p != 0)
    {
        values.push_back(v[p]);

        p = previous[p];
    }
    std::reverse(values.begin(), values.end());

    for(auto x: values)
        fout << x << ' ';
    fout << std::endl;

    return 0;
}