Pagini recente » Cod sursa (job #2782681) | Cod sursa (job #890215) | Cod sursa (job #1156605) | Cod sursa (job #2856854) | Cod sursa (job #305240)
Cod sursa(job #305240)
#include <cstdio>
#include <fstream>
using namespace std;
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;
ifstream fin("scmax.in");
freopen("scmax.out", "w", stdout);
fin >> N;
L = 1, M[0] = 0, M[1] = 1, P[1] = 0;
fin >> X[1];
for (i = 2; i <= N; ++i) {
fin >> 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]; } while ((j = P[j]));
for (; L; --L) printf("%d ", ans[L]);
printf("\n");
return 0;
}