Pagini recente » Cod sursa (job #981561) | Cod sursa (job #876350) | Cod sursa (job #2335131) | Cod sursa (job #1690093) | Cod sursa (job #2931580)
#include <bits/stdc++.h>
using namespace std;
vector<int> lis(const vector<int>& v) {
size_t max_length = 1;
vector<size_t> end(v.size()), prev(v.size());
end[0] = 0;
prev[0] = 0;
auto bs = [&](int value) {
size_t index = 0, step = 1;
for (; step < max_length; step <<= 1);
for (; step; step >>= 1)
if (index + step < max_length && v[end[index + step]] < value)
index += step;
return index;
};
for (size_t i = 1; i < v.size(); ++i)
if (v[i] <= v[end[0]]) {
end[0] = i;
prev[i] = i;
} else if (v[i] > v[end[max_length - 1]]) {
prev[i] = end[max_length - 1];
end[max_length++] = i;
} else {
size_t pos = bs(v[i]);
prev[i] = end[pos];
end[pos + 1] = i;
}
vector<int> ans(max_length);
size_t index = end[max_length - 1];
auto it = ans.rbegin();
for (size_t i = 0; i < max_length; ++i) {
*(it++) = v[index];
index = prev[index];
}
return ans;
}
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
size_t n;
fin >> n;
vector<int> v(n);
for (int&x : v)
fin >> x;
vector<int> ans = lis(v);
fout << ans.size() << '\n';
for (int x : ans)
fout << x << ' ';
fout << '\n';
}