Pagini recente » Cod sursa (job #2349866) | Cod sursa (job #2038478) | Cod sursa (job #1849240) | Cod sursa (job #2733165) | Cod sursa (job #2321065)
#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;
}