Cod sursa(job #2029153)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 29 septembrie 2017 16:06:52
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.83 kb
#include <stdio.h>
#define MAX 100005

int n, a[MAX], b[MAX], p[MAX], lenb;

void print(int pos, int n) {
    while(p[n] != pos)
        --n;
    if(pos > 1)
        print(pos - 1, n - 1);
    printf("%d ", a[n]);
}

int cb(int x) {
    int l = 1, r = lenb;
    while(l <= r) {
        int m = (l + r) / 2;
        if(b[m] >= x) {
            if(m == 0 || b[m - 1] < x)
                return m;
            r = m - 1;
        }
        else
            l = m + 1;
    }

    return lenb + 1;
}

int main() {
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);

    int j;
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        j = cb(a[i]);
        b[j] = a[i];
        p[i] = j;
        if(lenb < j)
            lenb = j;
    }

    printf("%d\n", lenb);
    print(lenb, n);
    return 0;
}