Cod sursa(job #3304589)

Utilizator unomMirel Costel unom Data 25 iulie 2025 12:25:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");
int n;
int v[100005];
int dp[100005];
int from[100005];
unordered_map<int, int> last;
vector<int> ans;
int INF = 2e9 + 1;

int main()
{
    in>>n;

    dp[0] = 0;
    last[0] = 0;
    for(int i = 1; i<=n; i++)
    {
        dp[i] = INF;
    }

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

        int best = lower_bound(dp, dp + n + 1, v[i]) - dp;

        from[i] = last[dp[best - 1]];

        dp[best] = v[i];
        last[v[i]] = i;
    }

    for(int i = n; i>=0; i--)
    {
        if(dp[i] != INF)
        {
            out<<i<<'\n';

            int cur = last[dp[i]];
            while(cur != 0)
            {
                ans.push_back(v[cur]);

                cur = from[cur];
            }

            break;
        }
    }

    reverse(ans.begin(), ans.end());

    for(auto it: ans)
    {
        out<<it<<" ";
    }

    return 0;
}