Cod sursa(job #1023539)

Utilizator dropsdrop source drops Data 7 noiembrie 2013 10:13:29
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX 100001

int N, X[MAX], Bst[MAX], C[MAX], K, Y;

int FindPosition(int Val, int Lo, int Hi) {
    int Mid;
    while (Hi - Lo > 1) {
        Mid = (Lo + Hi) / 2;
        if(C[Mid] < Val) {
            Lo = Mid;
        } else {
            Hi = Mid;
        }
    }
    if (C[Lo] >= Val)
        return Lo; else
        return Hi;
}

void PrintSol(int N, int K) {
    if (K > 0)
    for (int i = N - 1; i >= 0; i--) {
        if (Bst[i] == K) {
                PrintSol(i, K - 1);
                printf("%d ", X[i]);
                return;
        }
    }
}

int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &X[i]);
        Y = FindPosition(X[i], 1, K + 1);
        Bst[i] = Y;
        C[Y] = X[i];
        if (Y > K) K = Y;
    }
    printf("%d\n", K);
    PrintSol(N, K);

    return 0;
}