Pagini recente » Cod sursa (job #2130376) | Cod sursa (job #712817) | Cod sursa (job #1346021) | Cod sursa (job #2232042) | Cod sursa (job #1475456)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX = 100505;
int n, A[NMAX], best[NMAX], aib[NMAX];
vector<int> V;
void read() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &A[i]);
}
}
void prepare() {
V.assign(A + 1, A + n + 1);
sort(V.begin(), V.end());
V.resize(unique(V.begin(), V.end()) - V.begin());
for (int i = 1; i <= n; i++) {
auto it = lower_bound(V.begin(), V.end(), A[i]);
A[i] = it - V.begin() + 1;
}
}
inline int lsb(int x) {
return x & -x;
}
int getMax(int pos) {
int res = 0;
for ( ; pos; pos -= lsb(pos)) {
res = max(res, aib[pos]);
}
return res;
}
void update(int pos, int val) {
for ( ; pos <= (int)V.size(); pos += lsb(pos))
aib[pos] = max(aib[pos], val);
}
void recons(int pos) {
if (pos == 0) {
return ;
}
for (int i = pos - 1; i >= 1; i--) {
if (best[i] == best[pos] - 1) {
recons(i);
break ;
}
}
printf("%d ", V[A[pos] - 1]);
}
void solve() {
int bestV = -1, bestP;
for (int i = 1; i <= n; i++) {
best[i] = 1 + getMax(A[i] - 1);
update(A[i], best[i]);
if (best[i] > bestV) {
bestV = best[i];
bestP = i;
}
}
printf("%d\n", bestV);
recons(bestP);
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
read();
prepare();
solve();
return 0;
}