Cod sursa(job #2321065)

Utilizator MateiTrandafirMatei Trandafir MateiTrandafir Data 15 ianuarie 2019 17:26:31
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <set>
#include <utility>

constexpr int N = 100001;

int v[N], prev[N], r[N];

std::set<std::pair<int, int>> len;

int main() {
    std::ifstream in("scmax.in");
    std::ofstream out("scmax.out");
    int i, n, min = 2000000001, best;
    in >> n;
    for (i = 0; i < n; ++i) {
        in >> v[i];
        if (v[i] > min) {
            auto end = len.rend();
            best = 0;
            for (auto it = len.rbegin(); it != end; it++) {
                if (v[it->second] == v[i] && it->first > best) best = it->first;
                else if (v[it->second] < v[i]) {
                    if (it->first < best) continue;
                    else best = it->first;
                    prev[i] = it->second;
                    auto p = *it;
                    len.insert(std::make_pair(it->first + 1, i));
                    if (*it != p) it++;
                }
            }
        } else if (v[i] < min) {
            min = v[i];
            len.insert(std::make_pair(1, i));
            prev[i] = -1;
        }
    }
    const std::pair<int, int> p = *len.rbegin();
    out << p.first << '\n';
    int j = 0;
    for (i = p.second; i != -1; i = prev[i]) {
        r[j] = v[i];
        ++j;
    }
    for (--j; j >= 0; --j) out << r[j] << ' ';
    return 0;
}