Pagini recente » Cod sursa (job #1149535) | Cod sursa (job #2847244) | Cod sursa (job #2602866) | Cod sursa (job #293323) | Cod sursa (job #289263)
Cod sursa(job #289263)
#include <cstdio>
const int NMAX = 100001;
inline int max(int a, int b) { return a > b ? a : b; }
int main()
{
int N, L, M[NMAX] = {}, X[NMAX], P[NMAX], ans[NMAX];
int i, j, step;
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d\n", &N);
L = 1;
M[0] = 0;
M[1] = 1;
P[1] = 0;
scanf("%d ", X + 1);
for (i = 2; i <= N; ++i) {
scanf("%d ", X + i);
//BS
for (step = 1; step <= L; step <<= 1);
for (j = 0; step; step >>= 1)
if (j + step <= L)
if ( X[M[j + step]] < X[i] )
j += step;
P[i] = M[j];
if (X[i] < X[M[j + 1]] || j == L) {
M[j + 1] = i;
L = max(L, j + 1);
}
}
printf("%d\n", L);
j = M[L];
step = 1;
do {
ans[step++] = X[j];
j = P[j];
} while (j);
for (i = L; i >= 1; --i)
printf("%d ", ans[i]);
printf("\n");
return 0;
}