Pagini recente » Cod sursa (job #1513772) | Cod sursa (job #1353116) | Cod sursa (job #1521784) | Rating aaaaaaaaaaaa (CNITV_Paul_Maria_Bogdan) | Cod sursa (job #2923963)
#include <bits/stdc++.h>
using namespace std;
int main() {
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
fin >> n;
vector<int> v(n), end(n), parent(n), length(n);
for (int& x : v)
fin >> x;
end[0] = 0;
length[0] = 1;
parent[0] = 0;
int max_length = 1;
auto bs = [&](int value) {
int 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 (int i = 1; i < n; ++i) {
if (v[i] < v[end[0]]) {
end[0] = i;
parent[i] = i;
} else if (v[i] > v[end[max_length - 1]]) {
parent[i] = end[max_length - 1];
end[max_length++] = i;
} else {
int pos = bs(v[i]);
parent[i] = end[pos];
end[pos + 1] = i;
}
}
fout << max_length << '\n';
vector<int> seq(max_length);
seq[0] = end[max_length - 1];
for (int i = 1; i < max_length; ++i)
seq[i] = parent[seq[i - 1]];
for (int i = max_length - 1; i >= 0; --i)
fout << v[seq[i]] << ' ';
fout << '\n';
}