Pagini recente » Cod sursa (job #417044) | crevus_training_1 | Autentificare | Profil eudanip | Cod sursa (job #1519147)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#define MAXN 100005
int N;
int A[MAXN], P[MAXN], M[MAXN];
void print_seq(int pos) {
if (!pos) return;
print_seq(P[pos]);
printf("%d ", A[pos]);
}
int main() {
assert(freopen("scmax.in", "r", stdin));
freopen("scmax.out", "w", stdout);
int i, k, step, max_len = 0, pos;
scanf("%d", &N);
for (i = 1; i <= N; ++i) scanf("%d", &A[i]);
for (i = 1; i <= N; ++i) {
for (step = 1; step <= max_len; step <<= 1);
k = 0;
for (; step; step >>= 1)
if (k + step <= max_len && A[M[k + step]] < A[i])
k += step;
if (!M[k + 1] || A[M[k + 1]] > A[i]) {
M[k + 1] = i;
P[i] = M[k];
}
if (k + 1 > max_len) {
++max_len;
pos = i;
}
}
printf("%d\n", max_len);
print_seq(pos);
//fprintf(stderr, "%.3lf\n\n", (float)clock() / CLOCKS_PER_SEC);
return 0;
}