Cod sursa(job #3320647)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 6 noiembrie 2025 20:33:48
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 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> norm;
const int VMAX = 2e9;
const int NMAX = 1e5 + 1;
int aib[NMAX], n;

void update(int x, int y)
{
    for (int i = x; i <= n; 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], c[NMAX], ans[NMAX];

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

    sort(c + 1, c + n + 1);

    int i = 1, poz = 1;
    for (int i = 1; i <= n; ++i)
    {
        while (i < n && c[i] == c[i + 1])
            ++i;
        norm[c[i]] = poz++;
    }

    for (int i = 1; i <= n; ++i)
    {
        c[i] = norm[v[i]];
        ans[i] = query(c[i] - 1) + 1;
        maxi = max(maxi, ans[i]);
        update(c[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;
}