Cod sursa(job #3282823)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 6 martie 2025 21:49:20
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, a[100005], dp[100005], parent[100005], lis_index[100005], top;
vector<int> lis;

void Add(int index)
{
    int x = a[index];
    int st = 1, dr = top, P = top + 1;

    while (st <= dr)
    {
        int mij = (st + dr) / 2;
        if (a[dp[mij]] >= x)
        {
            P = mij;
            dr = mij - 1;
        }
        else st = mij + 1;
    }

    dp[P] = index;
    lis_index[P] = index;
    if (P > 1) parent[index] = lis_index[P - 1];
    if (P > top) top = P;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
    {
        fin >> a[i];
        parent[i] = -1;
    }

    for (int i = 1; i <= n; i++)
        Add(i);

    fout << top << "\n";

    int last_index = dp[top];
    while (last_index != -1)
    {
        lis.push_back(a[last_index]);
        last_index = parent[last_index];
    }

    reverse(lis.begin(), lis.end());
    for (int num : lis)
        fout << num << " ";

    return 0;
}