Cod sursa(job #3309099)

Utilizator CatalinPangaleanuCatalin Pangaleanu CatalinPangaleanu Data 1 septembrie 2025 00:53:23
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>

int binarySearch(int left, int right, int number, const std::vector<int> &tails, const std::vector<int> &numbers)
{
    while (left + 1 < right)
    {
        int middle = (left + right) / 2;

        if (numbers[tails[middle]] > number)
            right = middle;
        else
            left = middle;
    }

    return right;
}

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

    int n;
    inFile >> n;

    std::vector<int> numbers(n);

    for (int i = 0; i < n; ++i)
    {
        inFile >> numbers[i];
    }

    inFile.close();

    std::vector<int> tails, previous(n);
    tails.push_back(-1);

    for (int i = 0; i < n; ++i)
    {
        if (tails.back() == -1 || numbers[i] > numbers[tails.back()])
        {
            previous[i] = tails.back();
            tails.push_back(i);

            continue;
        }

        int position = binarySearch(0, tails.size(), numbers[i], tails, numbers);

        tails[position] = i;
        previous[i] = tails[position - 1];
    }

    std::vector<int> indexPath;
    indexPath.push_back(tails.back());

    while (previous[indexPath.back()] != -1)
    {
        indexPath.push_back(previous[indexPath.back()]);
    }

    std::ofstream outFile;
    outFile.open("scmax.out");

    outFile << tails.size() - 1 << '\n';

    for (int i = indexPath.size() - 1; i >= 0; --i)
    {
        outFile << numbers[indexPath[i]] << ' ';
    }

    outFile.close();

    return 0;
}