Cod sursa(job #2795595)

Utilizator Langa_bLanga Radu Langa_b Data 6 noiembrie 2021 17:32:57
Problema Subsir crescator maximal Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n, v[1002], rez[1002];
vector<int> lg;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> v[i];
    }
    lg.emplace_back(1e9);
    for (int i = n; i >= 1; i--) {
        if (v[i] <= lg[lg.size() - 1]) {
            lg.emplace_back(v[i]);
            rez[i] = lg.size() - 1;
        }
        else {
            int st = 1;
            int dr = lg.size() - 1;
            int mid = (dr + st) / 2;
            while (st + 1 < dr) {
                mid = (dr + st) / 2;
                if (lg[mid] <= v[i]) {
                    dr = mid;
                }
                else {
                    st = mid;
                }
            }
            if (lg[dr] <= v[i]) {
                rez[i] = dr;
                lg[dr] = v[i];
            }
        }
    }
    int maxi = -1;
    for (int i = 1; i <= n; i++) {
        if (maxi < rez[i]) {
            maxi = rez[i];
        }
    }
    cout << lg.size()-1 << '\n';
    int prev = -1;
    int cnt = lg.size() - 1;
    rez[n] = 1;
    int ok = 0;
    for (int i = 1; i <= n; i++) {
        if (rez[i] == 1) {
            ok = 1;
        }
    }
    if (ok == 0) {
        return 0;
    }
    int cntalt = 0;
    for (int i = 1; i <= n; i++) {
        if (rez[i] == cnt && v[i] > prev) {
            cout << v[i] << ' ';
            prev = v[i];
            cntalt++;
            cnt--;
        }
    }
    if (cnt == 1 || cntalt!=lg.size()-2) {
        cout << -11;
    }
}