Cod sursa(job #2136067)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 19 februarie 2018 16:51:50
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<cstdio>
#include<cstring>
using namespace std;
#define NMAX 100005
int n, h[NMAX], sol[NMAX], length, v[NMAX];

int BinarySearch(int val, int left, int right){
    int m  = (left + right) / 2 ;

    if(val <= v[ h[m] ] && val >= v[ h[m-1] ]){
        return m;
    }
    else
    if(val < v[ h[m] ]){
        return BinarySearch(val, left, m);
    }
    else{
        return BinarySearch(val, m + 1, right);
    }
}

void afis(int i){
    if(sol[i] == -1){
        return;
    }

    afis( sol[i] );
    printf("%d ", v[i]);
}

int main()
{
    memset(sol, -1, sizeof(sol));

    int i, poz;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

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

    h[1] = 1;
    sol[1] = 0;
    length = 1;

    for(i=2; i<=n; i++){
        if(v[i] < v[ h[1] ]){
            h[1] = i;
            sol[i] = h[0];
        }
        else
        if(v[i] > v[ h[length] ]){
            h[++length] = i;
            sol[i] = h[length - 1];
        }
        else{
            poz = BinarySearch(v[i], 1, length);
            h[poz] = i;
            sol[i] = h[poz - 1];
        }
    }

    printf("%d\n", length);
    afis(h[length]);
    return 0;
}