Cod sursa(job #1244389)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 17 octombrie 2014 11:12:02
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>

#define Nmax 100005

int n;
int a[Nmax];
int best[Nmax];
int poz[Nmax];
int s[Nmax], sn;
int sir_max, poz_max;

int search(int x){
    int l, r, m;
    l = 0; r = sn;
    while (l <= r){
        m = (l + r) / 2;
        if (a[s[m]] < x && x <= a[s[m + 1]]) return m;
        else if (x > s[s[m]])
            l = m + 1;
        else
            r = m - 1;
    }
    return sn;
}

void solve(){
    int p;
    sn = 0;
    s[1] = 1;
    for (int i = 2; i <= n; ++i){
        p = search(a[i]);
        poz[i] = s[p];
        best[i] = p + 1;
        s[p + 1] = i;
        if (sn < p + 1) sn = p + 1;

    }

    // for (int i = 1; i <= n; ++i)
    //     printf("%d ", best[i]);
    // printf("\n");
}

void write_sir(int i){
    if (!i) return;
    write_sir(poz[i]);
    printf("%d ", a[i]);
}

void write(){
    for (int i = 1; i <= n; ++i)
        if (best[i] > sir_max){
            sir_max = best[i];
            poz_max = i;
        }
    printf("%d\n", sir_max);
    write_sir(poz_max);
    printf("\n");
}

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);

    solve();
    write();

    return 0;
}