Cod sursa(job #3304475)

Utilizator robigiirimias robert robigi Data 23 iulie 2025 23:30:54
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <vector>

using namespace std;

int binarySearch(vector<pair<long long, int>>::iterator begin, vector<pair<long long, int>>::iterator end, long long x)
{
    int left = 0, right = end - begin - 1;

    while (left <= right)
    {
        int mid = left + (right - left) / 2;
        if ((begin + mid)->first < x)
            left = mid + 1;
        else
            right = mid - 1;
    }
    if (left < end - begin)
        return left;
    return -1;
}


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

    int n;
    vector<long long> v, dp;
    vector<pair<long long, int>> tails;
    vector<int> indices;

    fin >> n;

    for (int i = 0; i < n; ++i)
    {
        long long x;
        fin >> x;
        v.push_back(x);
    }

    dp.resize(n + 1, 0);
    tails.push_back(make_pair(v[0], 0));
    dp[0] = 1;
    indices.push_back(-1);

    for (int i = 1; i < n; ++i)
    {
        long long x = v[i];

        int position = binarySearch(tails.begin(), tails.end(), x);
        if (position == -1)
        {
            tails.push_back(make_pair(x, i));
            dp[i] = tails.size();
            indices.push_back(tails[tails.size() - 2].second);
        }
        else
        {
            tails[position] = make_pair(x, i);
            dp[i] = position + 1;
            if (position == 0)
                indices.push_back(-1);
            else
                indices.push_back(tails[position - 1].second);
        }
    }

    int max = -1;
    int maxi = -1;
    for (int i = 0; i < n; ++i)
    {
        if (dp[i] > max)
        {
            maxi = i;
            max = dp[i];
        }
    }

    fout << max << endl;

    vector <long long> result;

    for (int i = maxi; i >= 0; i = indices[i])
    {
        result.push_back(v[i]);
    }

    for (auto it = result.rbegin(); it != result.rend(); ++it)
    {
        fout << *it << " ";
    }

    return 0;

}