Cod sursa(job #1562841)

Utilizator Burbon13Burbon13 Burbon13 Data 5 ianuarie 2016 15:18:31
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

using namespace std;

const int nmx = 100002;

int n,v[nmx],sol[nmx],p[nmx],k;

void afish(int lvl, int i) {
    if(not i)
        return;
    if(p[i] == lvl) {
        afish(lvl-1,i-1);
        printf("%d ", v[i]);
    } else
        afish(lvl,i-1);
}

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

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

    for(int i = 1; i <= n; ++i) {
        if(v[i] > sol[k]) {
            sol[++k] = v[i];
            p[i] = k;
            continue;
        }
        int m,st = 1, dr = k,pos;
        while(st <= dr) {
            m = st + (dr - st) / 2;
            if(sol[m] < v[i])
                dr = m - 1;
            else {
                pos = m;
                st = m + 1;
            }

            sol[pos] = v[i];
            p[i] = pos;
        }
    }

    printf("%d\n", k);
    afish(k,n);

    return 0;
}