Cod sursa(job #216714)

Utilizator CezarMocanCezar Mocan CezarMocan Data 25 octombrie 2008 13:26:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[100100], d[100100], p[100100], sol[100100];
int i, j, n, lg, poz;

int bsearch(int l, int r) {
    int m = (l+r)/2;
    
    if ( ( v[d[m-1]] < v[i] ) && ( v[d[m]] >= v[i] ) )
        return m;
        
    if (l>r) 
        return lg+1;        
        
    if ( v[i] > v[d[m]] )
        return bsearch(m+1, r);
    else
        return bsearch(l, m-1);
}

int main(){
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%d", &n);
    
    for (i=1; i<=n; i++)
        scanf("%d", &v[i]);
        
    d[1] = 1;
    lg=1;
    
    for (i=2; i<=n; i++) {
        poz = bsearch(1, lg);        
        if (poz>lg)
            lg++;
        d[poz] = i;
        p[i] = d[poz-1];
    }
    
    printf("%d\n", lg);
    
    poz = d[lg];
    
    while (poz) {
        sol[0]++;
        sol[sol[0]] = v[poz];
        poz = p[poz];    
    } 
    
    for (i=sol[0]; i>=1; i--)
        printf("%d ", sol[i]);

    return 0;
}