Cod sursa(job #3369303)

Utilizator RuxandraPro12_Metehau Ruxandra Maria RuxandraPro12_ Data 19 octombrie 2026 16:09:11
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;

int n, aib[NMAX + 5], v_ini[NMAX + 5], v[NMAX + 5], lung[NMAX + 5];

pair <int, int> aux[NMAX + 5];

void normalizare () {
    for (int i = 1; i <= n; i++) {
        aux[i].first = v_ini[i];
        aux[i].second = i;
    }
    sort (aux + 1, aux + 1 + n);
    int val_c = 1;
    v[aux[1].second] = val_c;
    for (int i = 2; i <= n; i++) {
        if (aux[i].first > aux[i - 1].first)
            val_c++;
        v[aux[i].second] = val_c;
    }
}

void update (int poz, int val) {
    while (poz <= n) {
        aib[poz] = max (aib[poz], val);
        int p2 = (poz & (-poz));
        poz += p2;
    }
}

int query (int poz) {
    int maxim = 0;
    while (poz > 0) {
        maxim = max (maxim, aib[poz]);
        int p2 = (poz & (-poz));
        poz -= p2;
    }
    return maxim;
}

void refac_subsirul (int poz, int lung_c, int reper) {
    if (lung_c == 0 || poz == 0)
        return;
    if (lung[poz] == lung_c && v_ini[poz] < reper) {
        refac_subsirul (poz - 1, lung_c - 1, v_ini[poz]);
        fout << v_ini[poz] << " ";
    }
    else 
        refac_subsirul (poz - 1, lung_c, reper);
}

int main() {
    fin >> n;
    for (int i = 1; i <= n; i++) 
        fin >> v_ini[i];
    normalizare ();
    int poz_max = 0;
    for (int i = 1; i <= n; i++) {
        int l = query (v[i] - 1);
        lung[i] = l + 1;
        if (lung[i] > lung[poz_max])
            poz_max = i;
        update (v[i], lung[i]);
    }
    fout << lung[poz_max] << "\n";
    refac_subsirul(poz_max, lung[poz_max], INT_MAX);
    fout << "\n";
    return 0;
}