Cod sursa(job #3357898)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 19:37:42
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define MAX_SIZE 20000

int main() {
    std::ifstream input("scmax.in");
    std::ofstream output("scmax.out");

    int n, v[MAX_SIZE], dp[MAX_SIZE], pred[MAX_SIZE], pos_dp[MAX_SIZE];

    input >> n;

    for (int i = 1; i <= n; ++i) {
        input >> v[i];
        pred[i] = 0;
    }

    int len = 1;
    dp[1] = v[1];
    pos_dp[1] = 1;
    pred[1] = 0;

    for (int i = 2; i <= n; ++i) {
        if (v[i] > dp[len]) {
            pred[i] = pos_dp[len];
            dp[++len] = v[i];
            pos_dp[len] = i;
        } else {
            int l = 1, r = len;
            int pos = 0;
            while (l <= r) {
                int mid = (l + r) / 2;
                if (dp[mid] < v[i]) {
                    pos = mid;
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            pos++;
            dp[pos] = v[i];
            pos_dp[pos] = i;
            pred[i] = (pos > 1) ? pos_dp[pos - 1] : 0;
        }
    }

    int sol[MAX_SIZE];
    int k = len;
    int idx = pos_dp[len];
    while (idx != 0) {
        sol[k--] = v[idx];
        idx = pred[idx];
    }

    output << len << '\n';
    for (int i = 1; i <= len; ++i)
        output << sol[i] << ' ';

    return 0;
}