Cod sursa(job #3320292)

Utilizator pachy2007Pachitanu Matei pachy2007 Data 4 noiembrie 2025 20:18:54
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int N = 100000 + 5;
int n, v[N], dp[N], pred[N], lungime[N];

int main() {
    fin >> n;
    for (int i = 1; i <= n; i++) fin >> v[i];

    int lung = 0;
    for (int i = 1; i <= n; i++) {
        int st = 1, dr = lung, poz = 0;

        while (st <= dr) {
            int mij = (st + dr) / 2;
            if (v[dp[mij]] < v[i]) {
                poz = mij;
                st = mij + 1;
            } else {
                dr = mij - 1;
            }
        }

        pred[i] = dp[poz];
        int noua = poz + 1;

        dp[noua] = i;
        if (noua > lung) lung = noua;
        lungime[i] = noua;
    }

    fout << lung << '\n';

    // Reconstruim soluția
    vector<int> sol;
    int p = dp[lung];
    while (p) {
        sol.push_back(v[p]);
        p = pred[p];
    }
    reverse(sol.begin(), sol.end());

    for (auto x : sol) fout << x << ' ';
    fout << '\n';
    return 0;
}