Cod sursa(job #2869972)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 11 martie 2022 23:00:22
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pd = pair<double, double>;
using pld = pair<ld, ld>;
// #define LOCAL
#ifdef LOCAL
ifstream cin("input.txt");
ofstream cout("output2.txt");
#else
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#endif
#define cin ::cin
#define cout ::cout


int main()
{
    int N;
    cin >> N;
    vector<int> nrs(N);
    for (int i = 0; i < N; ++i)
    {
        cin >> nrs[i];
    }
    const int INF = 2.1e9;
    vector<int> dp(N + 1, INF), prev(N, -1);
    dp[0] = -INF;
    unordered_map<int, int> idxs;
    int max_len{};
    for (int i = 0; i < N; ++i)
    {
        const int j = upper_bound(begin(dp), end(dp), nrs[i]) - begin(dp);
        if (dp[j - 1] < nrs[i] && nrs[i] < dp[j])
        {
            dp[j] = nrs[i];
            if (j > 1)
            {
                prev[i] = idxs[dp[j - 1]];
            }
            max_len = max(max_len, j);
            idxs[nrs[i]] = i;
        }
    }
    stack<int> LIS;
    for (int i = idxs[dp[max_len]]; ~i; i = prev[i])
    {
        LIS.emplace(nrs[i]);
    }
    for (cout << max_len << "\n"; !LIS.empty() && cout << LIS.top() << " "; LIS.pop())
        ;
}