Cod sursa(job #1829858)

Utilizator alittlezzCazaciuc Valentin alittlezz Data 15 decembrie 2016 19:17:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int L[100005], prv[100005], v[100005];

int binarySearch(int lf, int rg, int x){
    int i,step;
    for(step = 1;step <= rg;step <<= 1);
    for(i = 0;step;step >>= 1){
        if(i + step <= rg && v[L[i + step]] <= x){
            i += step;
        }
    }
    return i;
}

void dfs(int index){
    if(index == 0){
        return;
    }
    dfs(prv[index]);
    printf("%d ", v[index]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int p,n,cnt,i,x;
    cnt = 0;
    scanf("%d", &n);
    for(i = 1;i <= n;i++){
        scanf("%d", &v[i]);
    }
    for(i = 1;i <= n;i++){
        x = v[i];
        p = binarySearch(1, cnt, x - 1) + 1;
        if(p > cnt){
            cnt++;
        }
        L[p] = i;
        prv[i] = L[p - 1];
    }
    printf("%d\n", cnt);
    dfs(L[cnt]);
    return 0;
}