Cod sursa(job #3316155)

Utilizator zxc11Doru Mihai zxc11 Data 17 octombrie 2025 16:45:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1e5;
int v[NMAX + 5], poz[NMAX + 5], parent[NMAX + 5];
int scm[NMAX + 5];

int main() {
    ifstream cin("scmax.in");
    ofstream cout("scmax.out");
    ios::sync_with_stdio(false), cin.tie(0);

    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> v[i];

    scm[1] = v[1];
    poz[1] = 1;
    int len = 1;

    for (int i = 2; i <= n; i++) {
        int st = 1, dr = len, r = len + 1;
        while (st <= dr) {
            int mid = (st + dr) / 2;
            if (scm[mid] >= v[i]) {
                r = mid;
                dr = mid - 1;
            } else st = mid + 1;
        }

        scm[r] = v[i];
        if (r > 1) parent[i] = poz[r - 1];
        poz[r] = i;
        if (r > len) len = r;
    }

    cout << len << "\n";
    vector<int> vf;
    int idx = poz[len];
    while (idx != 0) {
        vf.push_back(v[idx]);
        idx = parent[idx];
    }
    reverse(vf.begin(), vf.end());
    for (auto x : vf) cout << x << " ";
    cout << "\n";
    return 0;
}