Cod sursa(job #2923852)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 20 septembrie 2022 01:32:04
Problema Subsir crescator maximal Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
#define INFILE "scmax.in"
#define OUTFILE "scmax.out"
#define DIM 100005

using namespace std;

ifstream f(INFILE);
ofstream g(OUTFILE);

int n, length[DIM], best[DIM], v[DIM], len;
vector <int> solution;

int cb(int val) {
    int st = 1, dr = len, poz = len + 1;
    while (st <= dr) {
        int mid = (st + dr) / 2;

        if (best[mid] >= val) {
            poz = mid, dr = mid - 1;
        } else {
            st = mid + 1;
        }
    }
    return poz;
}

int main() {

    f >> n;
    for (int i = 1; i <= n; i++) {
        f >> v[i];
        int poz = cb(v[i]);
        best[poz] = v[i];
        length[i] = poz;
        len = max(len, poz);
    }

    int ind = n, actualLength = len, last = 100000000;
    while (actualLength) {
        if (actualLength == length[ind] && last > v[ind]) {
            solution.push_back(v[ind]);
            actualLength -= 1;
            last = v[ind];
        }
        ind--;
    }
    reverse(solution.begin(), solution.end());

    g << len << "\n";
    for (auto k: solution) {
        g << k << " ";
    }
    return 0;
}