Pagini recente » Cod sursa (job #3218671) | Cod sursa (job #3173413) | Cod sursa (job #1209293) | Cod sursa (job #1524243) | Cod sursa (job #2940583)
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
vector<int> Solve(const vector<int>& vec) {
vector<int> prev(vec.size(), -1);
vector<int> tops;
for (size_t i = 0; i < vec.size(); i += 1) {
auto pos = -1;
for (auto pow = 1 << 30; pow > 0; pow >>= 1) {
auto next = pos + pow;
if (next < (int)tops.size() && vec[tops[next]] < vec[i]) {
pos = next;
}
}
pos += 1;
if (pos > 0) {
prev[i] = tops[pos - 1];
}
if (pos >= (int)tops.size()) {
tops.push_back(i);
} else {
tops[pos] = i;
}
}
vector<int> res;
for (int pos = tops.back(); pos != -1; pos = prev[pos]) {
res.push_back(vec[pos]);
}
reverse(res.begin(), res.end());
return res;
}
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
fin >> n;
vector<int> vec(n);
for (auto& num : vec) {
fin >> num;
}
auto res = Solve(vec);
fout << res.size() << "\n";
for (const auto& num : res) {
fout << num << " ";
}
fout << "\n";
return 0;
}