Cod sursa(job #3356132)

Utilizator rapidu36Victor Manz rapidu36 Data 29 mai 2026 16:47:35
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>

using namespace std;

const int INF = 2e9 + 1;

ifstream in("scmax.in");
ofstream out("scmax.out");
vector <int> x;
vector <int> lung;
vector <int> val_min;

void refac_subsirul(int p, int l, int reper) {
    if (l == 0) {
        return;
    }
    if (x[p] < reper && lung[p] == l) {
        refac_subsirul(p - 1, l - 1, x[p]);
        out << x[p] << " ";
    } else {
        refac_subsirul(p - 1, l, reper);
    }
}

int caut_bin(int x) {
    int st = 0, dr = (int)val_min.size() - 1, rez = st - 1;
    while (st <= dr) {
        int m = (st + dr) / 2;
        if (val_min[m] < x) {
            st = m + 1;
            rez = m;
        } else {
            dr = m - 1;
        }
    }
    return rez;
}

int main() {
    int n, p_max = 0;
    in >> n;
    x.resize(n);
    lung.resize(n);
    for (int i = 0; i < n; i++) {
        in >> x[i];
        int j_0 = caut_bin(x[i]);
        if (j_0 == (int)val_min.size() - 1) {
            val_min.push_back(x[i]);
        } else {
            val_min[j_0+1] = x[i];
        }
        lung[i] = j_0 + 2;// in val_min pe poz j avem rez. pt subsiruri de lungime j - 1
        if (lung[i] > lung[p_max]) {
            p_max = i;
        }
    }
    in.close();
    out << lung[p_max] << "\n";
    refac_subsirul(p_max, lung[p_max], INF);
    out << "\n";
    out.close();
    return 0;
}