Pagini recente » Cod sursa (job #2502757) | Cod sursa (job #2525598) | Cod sursa (job #550342) | Cod sursa (job #681200) | Cod sursa (job #2878875)
#include <fstream>
#include <vector>
using namespace std;
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
fin >> n;
vector<int> vec(n);
vector<int> prev(n, -1);
vector<int> dp;
for (int i = 0; i < n; i += 1) {
fin >> vec[i];
auto bucket = -1;
for (int pow = 1 << 30; pow > 0; pow >>= 1) {
auto next = bucket + pow;
if (next < (int)dp.size() && vec[dp[next]] < vec[i]) {
bucket = next;
}
}
bucket += 1;
if (bucket >= 0 && bucket < (int)dp.size()) {
if (bucket > 0) {
prev[i] = dp[bucket - 1];
}
dp[bucket] = i;
} else {
if (!dp.empty()) {
prev[i] = dp.back();
}
dp.push_back(i);
}
}
vector<int> res(dp.size());
int index = dp.back();
for (int i = dp.size() - 1; i >= 0; i -= 1) {
res[i] = vec[index];
index = prev[index];
}
fout << dp.size() << "\n";
for (const auto& num : res) {
fout << num << " ";
}
fout << "\n";
return 0;
}