Cod sursa(job #1075949)

Utilizator crushackPopescu Silviu crushack Data 9 ianuarie 2014 19:18:52
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>
#define NMax 100010

const char IN[] = "scmax.in", OUT[] = "scmax.out";

int N, L;
int v[NMax], P[NMax], Q[NMax], sol[NMax];

int search( int x ) {

  int i, step;

  for ( step = 1; step < L; step <<= 1);
  for ( i = L + 1; step; step >>= 1)
    if ( i - step > 0 && x < Q[i - step] )
      i -= step;
  return i;
}

int main() {

  freopen(IN, "r", stdin);
  scanf("%d", &N);
  for ( int i = 1; i <= N; ++ i)
    scanf("%d", v + i);
  fclose(stdin);

  for ( int i = 1; i <= N; ++ i) {
    int poz = search( v[i] );
    if ( poz > 1 && Q[poz - 1] == v[i]) continue;
    if ( poz == L + 1 ) ++ L;
    Q[poz] = v[i];
    P[i] = poz;
  }

  for ( int i = N, l = L; i > 0; -- i) 
    if ( P[i] == l ) {
      sol[l] = v[i];
      -- l;
    }

  freopen(OUT, "w", stdout);
  printf("%d\n", L);
  for ( int i = 1; i <= L; ++ i)
    printf("%d ", sol[i]);
  printf("\n");
  return 0;
}