Cod sursa(job #3349812)

Utilizator Alexutu008Ionita Alexandru-Dumitru Alexutu008 Data 2 aprilie 2026 16:39:10
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

int n, a[100001];
int lis[100001], best_len[100001], k = 0;
vector<int> ans;

void add_to_lis(int current_index, int element) {
    if (k == 0) {
        lis[++k] = element;
        best_len[current_index] = 1;
        return;
    }

    int st = 1, dr = k, poz = k + 1;
    while (st <= dr) {
        int middle = st + dr >> 1;

        if (element <= lis[middle]) {
            dr = middle - 1;
            poz = middle;
        }
        else {
            st = middle + 1;
        }
    }

    lis[poz] = element;
    if (poz == k + 1) ++k;

    best_len[current_index] = poz;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        add_to_lis(i, a[i]);
    }

    cout << k << '\n';

    for (int i = n; i >= 1; --i) {
        if (best_len[i] == k) {
            ans.push_back(a[i]);
            --k;
        }
    }

    reverse(ans.begin(), ans.end());
    for (auto& i : ans) {
        cout << i << ' ';
    }

    return 0;
}