Cod sursa(job #3320644)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 6 noiembrie 2025 20:22:06
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <vector>
#include <unordered_map>
#include <stack>

using namespace std;

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

unordered_map<int, int> aib;
const int VMAX = 2e9;
const int NMAX = 1e5 + 1;

void update(int x, int y)
{
    for (int i = x; i <= NMAX; i += i & (-i))
        aib[i] = max(aib[i], y);
}

int query(int x)
{
    int maxi = 0;
    for (int i = x; i; i -= i & (-i))
        maxi = max(maxi, aib[i]);
    return maxi;
}

int v[NMAX], ans[NMAX];

int main()
{
    int n;
    fin >> n;
    int maxi = 0;
    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i];
        ans[i] = query(v[i] - 1) + 1;
        maxi = max(maxi, ans[i]);
        update(v[i], ans[i]);
    }

    fout << maxi << '\n';
    stack<int> lis;
    for (int i = n; i; --i)
    {
        if (ans[i] == maxi)
        {
            --maxi;
            lis.push(v[i]);
        }
    }

    while (!lis.empty())
    {
        fout << lis.top() << " ";
        lis.pop();
    }

    return 0;
}