Pagini recente » Cod sursa (job #2075931) | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2683397)
#include <fstream>
std::ifstream in("scmax.in");
std::ofstream out("scmax.out");
constexpr int N = 100000;
int v[N], l[N], vmin[N];
void print_subseq(int idx) {
if (idx < 0)
return;
int ipred = idx - 1;
while (ipred >= 0 && l[ipred] != l[idx] - 1)
--ipred;
print_subseq(ipred);
out << v[idx] << ' ';
}
int main() {
int n;
in >> n;
for (int i = 0; i < n; ++i)
in >> v[i];
l[0] = 1;
int maxlen = 1;
vmin[0] = v[0];
for (int i = 1; i < n; ++i) {
int j = std::lower_bound(vmin, vmin + maxlen, v[i]) - vmin;
if (j == maxlen)
++maxlen;
l[i] = j + 1;
vmin[j] = v[i];
}
out << maxlen << '\n';
int imaxlen = n - 1;
while (l[imaxlen] != maxlen)
--imaxlen;
print_subseq(imaxlen);
}