Cod sursa(job #3349815)

Utilizator Alexutu008Ionita Alexandru-Dumitru Alexutu008 Data 2 aprilie 2026 16:50:11
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 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;
}

void afis(int i, int k) {
    if (i == 0) {
        return;
    }
    if (best_len[i] == k && k != 0) {
        afis(i-1, k-1);
        cout << a[i] << ' ';
    }
    afis(i - 1, k);
    return;
}

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';
    afis(n, k);

    return 0;
}