Pagini recente » Cod sursa (job #553759) | Cod sursa (job #1635670) | Cod sursa (job #2277694) | Cod sursa (job #1165760) | Cod sursa (job #2075830)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int N;;
vector<int> A, ant;
void recons(int pos) {
if (pos != -1) {
recons(ant[pos]);
printf("%d ", A[pos]);
}
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &N);
int x;
ant.assign(N + 1, -1);
for (int i = 1; i <= N; i++) {
scanf("%d", &x);
A.push_back(x);
}
vector<int> bestSol, bestIdx;
for (int i = 0; i < A.size(); i++) {
if (bestSol.size() == 0 || bestSol.back() < A[i]) {
bestSol.push_back(A[i]);
bestIdx.push_back(i);
if (bestSol.size() > 1) {
ant[i] = bestIdx[(int)bestSol.size() - 2];
}
} else {
auto it = lower_bound(bestSol.begin(), bestSol.end(), A[i]);
*it = A[i];
int idx = it - bestSol.begin();
bestIdx[idx] = i;
if (idx > 0) {
ant[i] = bestIdx[idx - 1];
}
}
}
printf("%d\n", (int)bestSol.size());
recons(bestIdx.back());
return 0;
}