Pagini recente » Cod sursa (job #2262045) | Cod sursa (job #2500568) | Cod sursa (job #1282292) | Cod sursa (job #251138) | Cod sursa (job #1475448)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX = 100505;
int n, A[NMAX], best[NMAX], r, ant[NMAX];
// best[i] = lowest last element of a increasing seq of length i
void read() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &A[i]);
}
}
void solve() {
for (int i = 1; i <= n; i++) {
if (A[i] > A[best[r]]) {
ant[i] = best[r];
best[++r] = i;
} else {
auto it = lower_bound(best + 1, best + r + 1, i,
[&] (const int& a, const int& b) -> bool {
return A[a] < A[b];
});
best[it - best] = i;
ant[i] = best[it - best - 1];
}
}
printf("%d\n", r);
// recons
vector<int> sol;
int last = best[r];
while (last) {
sol.push_back(last);
last = ant[last];
}
reverse(sol.begin(), sol.end());
for (size_t i = 0; i < sol.size(); i++) {
if (i > 0) printf(" ");
printf("%d", A[sol[i]]);
}
printf("\n");
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
read();
solve();
return 0;
}