Cod sursa(job #1495580)

Utilizator MayuriMayuri Mayuri Data 3 octombrie 2015 11:38:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

using namespace std;

int v[100001], q[100001], p[100001];

int bs(int st, int dr, int val) {
    int med;
    while(st <= dr) {
        med = st + (dr - st) / 2;
        if(q[med] >= val) {
            dr = med - 1;
        } else {
            st = med + 1;
        }
    }
    return st;
}

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

    int n, ln = 0, poz;
    scanf("%d", &n);

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

    for(int i = 1; i <= n; ++ i) {
        poz = bs(1, ln, v[i]);
        q[poz] = v[i];
        p[i] = poz;
        if(poz > ln)
            ++ ln;
    }
    int cln = ln;
    printf("%d\n", ln);
    for(int i = n; i >= 1; -- i) {
        if(p[i] == ln) {
            q[ln] = v[i];
            -- ln;
        }
    }

    for(int i = 1; i <= cln; ++ i) {
        printf("%d ", q[i]);
    }

    return 0;
}