Cod sursa(job #3152472)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 25 septembrie 2023 12:18:14
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>

using namespace std;

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

int main()
{
    int n;
    fin >> n;

    vector<int>v(n + 1);
    vector<int>cap(n + 1);
    vector<int>poz(n + 1);

    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i];
    }

    int lung = 0;
    for(int i = 1; i <= n; i++)
    {
        int left = 1, right = lung, mid;
        while(left <= right)
        {
            mid = (left + right) / 2;
            if(cap[mid] < v[i])
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }

        cap[left] = v[i];
        poz[i] = left;
        lung = max(left, lung);
    }

//    for(int i = 1; i <= n; i++)
//    {
//        fout << cap[i] << " ";
//    }
//    fout << "\n";
//    for(int i = 1; i <= n; i++)
//    {
//        fout << poz[i] << " ";
//    }
//    fout << "\n";

    vector<int>sol;
    fout << lung << "\n";
    for(int i = n; i >= 1; i--)
    {
        if(poz[i] == lung)
        {
            sol.push_back(v[i]);
            lung--;
        }
    }

    for(int i = sol.size() - 1; i >= 0; i--)
    {
        fout << sol[i] << " ";
    }



    return 0;
}