Cod sursa(job #1673103)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 3 aprilie 2016 14:19:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#define DIM 100005
using namespace std;

int v[DIM], poz[DIM], indi[DIM], best[DIM];
int m;

int caut( int x );
void afis( int k );

int main()
{

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

    int n, i, j, s, t, d, k;

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

    indi[1] = best[1] = m = 1;
    for( i = 2; i <= n; ++i ){
        k = caut( v[i] );
        indi[k+1] = i;
        best[i] = k + 1;
        poz[i] = indi[k];
        if( k + 1 > m ) m++;
    }

    printf("%d\n",m);

    k = m = 0;
    for( i = 1; i <= n; ++i ){
        if( best[i] > m ){
            m = best[i];
            k = i;
        }
    }

    afis( k );

    return 0;
}

int caut( int x ){

    int i = 0;
    int pas = (1<<17);

    while( pas ){
        if( i + pas <= m && v[indi[i+pas]] < x ) i += pas;
            pas /= 2;
    }

    return i;

}

void afis( int k ){

    if(  poz[k] == 0 ){
        printf("%d ",v[k]);
        return ;
    }

    afis(poz[k]);
    printf("%d ",v[k]);

}