Cod sursa(job #1670212)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 31 martie 2016 16:00:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#define DIM 100005
using namespace std;

int v[DIM], D[DIM], L[DIM], P[DIM];
int m;

void afisare( int k ){

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

    afisare( P[k] );
    printf("%d ",v[k]);

}

int caut( int k ){

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

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

  return i;

}

int main()
{

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

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

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

    L[1] = D[1] = m = 1;
    for( i = 2; i <= n; ++i ){
        k = caut( v[i] );
        L[i] = k + 1;
        D[k+1] = i;
        P[i] = D[k];
        if( k + 1 > m ) m++;
    }

    ma = 0;
    for( i = 1; i <= n; ++i ){
        if( ma < L[i] ){
            ma = L[i];
            k = i;
        }
    }

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

    return 0;
}