Cod sursa(job #2325371)

Utilizator MateiTrandafirMatei Trandafir MateiTrandafir Data 22 ianuarie 2019 16:26:34
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>

constexpr int N = 100001;

int v[N], prev[N], aux[N], start = 1;
unsigned int size = 1;

inline int binary_search(int x) {
    int at = 0;
    for (int step = start; step != 0; step >>= 1) if (at + step <= size && v[aux[at + step]] < x) at += step;
    return at;
}

inline void increase_size() {
    ++size;
    if (start <= size >> 1u) start <<= 1;
}

int main() {
    std::ifstream in("scmax.in");
    std::ofstream out("scmax.out");
    int i, n, x;
    in >> n >> v[1];
    aux[1] = 1;
    for (i = 2; i <= n; ++i) {
        in >> v[i];
        x = binary_search(v[i]);
        if (x == size) increase_size();
        prev[i] = aux[x];
        aux[x + 1] = i;
    }
    out << size << '\n';
    x = -1;
    for (i = aux[size]; i != 0; i = prev[i]) aux[++x] = v[i];
    for (; x >= 0; --x) out << aux[x] << ' ';
    return 0;
}