Cod sursa(job #3316153)

Utilizator zxc11Doru Mihai zxc11 Data 17 octombrie 2025 16:43:38
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

#define pb push_back

const int NMAX = 1e5;

int v[NMAX + 5], poz[NMAX + 5];

vector <int> rec, vf;

int scm[NMAX]; /// scm[i] = cea mai mica valoare cu care sa se termine sirul de lungime i

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];
    for (int i = 2; i <= n; i++) {
        int st = 1, dr = n, r = -1;
        while (st <= dr) {
            int mid = (st + dr) / 2;
            if (v[i] > scm[mid] && scm[mid] != 0) {
                r = mid;
                st = mid + 1;
            }
            else dr = mid - 1;
        }
        if (r == -1) scm[1] = min(scm[1], v[i]);
        else {
            scm[r + 1] = v[i];
            poz[r + 1] = i;
        }
    }

    int ans = 0;
    for (int i = 1; i <= n; i++)
        if (scm[i] > 0)
           ans = max(ans, i);

    cout << ans << '\n';

    for (int i = ans; i >= 2; i--) vf.pb(v[poz[i]]);
    for (int i = poz[2]; i >= 1; i--) {
        if (v[i] < v[poz[2]]) {
            vf.pb(v[i]);
            break;
        }
    }
    reverse(vf.begin(), vf.end());
    for (auto x: vf) cout << x << " ";
    return 0;
}