Cod sursa(job #3364156)

Utilizator razviii237Uzum Razvan razviii237 Data 31 august 2026 09:30:48
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <algorithm>
// #include <iostream>
#include <vector>
#include <fstream>
using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

int main() {
    int n;
    cin >> n;

    vector<int> a(n);
    for (int& x : a)
        cin >> x;

    vector<int> tail;          // valorile folosite pentru căutare binară
    vector<int> last;          // indicii corespunzători din a
    vector<int> parent(n, -1); // legăturile pentru reconstrucție

    for (int i = 0; i < n; ++i) {
        // Prima poziție cu valoare >= a[i]
        int p = lower_bound(tail.begin(), tail.end(), a[i])
                - tail.begin();

        // Predecesorul lui a[i] aparține subșirului de lungime p
        if (p > 0)
            parent[i] = last[p - 1];

        if (p == tail.size()) {
            tail.push_back(a[i]);
            last.push_back(i);
        } else {
            tail[p] = a[i];
            last[p] = i;
        }
    }

    cout << tail.size() << '\n';

    // Reconstruim subșirul pornind de la ultimul element
    vector<int> lis;

    if (!last.empty()) {
        int index = last.back();

        while (index != -1) {
            lis.push_back(a[index]);
            index = parent[index];
        }

        reverse(lis.begin(), lis.end());
    }

    for (int x : lis)
        cout << x << ' ';
    cout << '\n';

    return 0;
}