Cod sursa(job #1160892)

Utilizator cbanu96Banu Cristian cbanu96 Data 30 martie 2014 21:35:53
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define FILEIN "scmax.in"
#define FILEOUT "scmax.out"
#define NMAX 100005

int A[NMAX], B[NMAX], D[NMAX], Pre[NMAX], Pos[NMAX], Sol[NMAX], N;
int AIB[NMAX];

void update(int x, int i) {
    while (x <= N) {
        if (D[i] > D[AIB[x]])
            AIB[x] = i;
        x += (x & -x);
    }
}

int query(int x) {
    int y = 0;
    while (x) {
        if (D[AIB[x]] > D[y])
            y = AIB[x];
        x -= (x & -x);
    }

    return y;
}

int main() {
    freopen(FILEIN, "r", stdin);
    freopen(FILEOUT, "w", stdout);

    scanf("%d", &N);
    for ( int i = 1; i <= N; i++ ) scanf("%d", &A[i]);

    int k = 0;
    for ( int i = 1; i <= N; i++ ) {
        if (A[i] != A[i-1])
            B[++k] = A[i];
    }

    sort(B+1, B+k+1);

    for ( int i = 1; i <= N; i++ ) {
        Pos[i] = lower_bound(B+1, B+k+1, A[i]) - B;
    }

    for ( int i = 1; i <= N; i++ ) {
        Pre[i] = query(Pos[i] - 1);
        D[i] = D[Pre[i]] + 1;
        update(Pos[i], i);
    }

    int MaxI = 0;
    for ( int i = 1; i <= N; i++ ) {
        if (D[i] > D[MaxI])
            MaxI = i;
    }

    k = 0;
    for ( int i = MaxI; i; i = Pre[i]) {
        Sol[++k] = A[i];
    }

    printf("%d\n", D[MaxI]);
    for ( int i = k; i; i-- ) {
        printf("%d ", Sol[i]);
    }
    printf("\n");

    return 0;
}