Cod sursa(job #1519147)

Utilizator theprdvtheprdv theprdv Data 6 noiembrie 2015 21:45:20
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.03 kb
#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;
}