Cod sursa(job #2692403)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 2 ianuarie 2021 16:41:28
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <ctype.h>

#define MAXN 100000

FILE *fin, *fout;

int num[MAXN];
int aux[MAXN + 1];// santinela la sfarsit
int pos[MAXN];
int elem[MAXN];

static inline int fgetint(){
  int n = 0, ch;

  while( !isdigit(ch = fgetc(fin)) );
  do
    n = n * 10 + ch - '0';
  while( isdigit(ch = fgetc(fin)) );

  return n;
}

static inline void fputint( int n, int term ){
  int i = 10;
  char out[] = "0000000000?";
  out[i] = term;

  if( n == 0 ){
    fputs(out + (i - 1), fout);
    return;
  }

  while( n ){
    out[--i] = n % 10 + '0';
    n /= 10;
  }

  fputs(out + i, fout);
}

int main(){
  fin  = fopen("scmax.in",  "r");
  fout = fopen("scmax.out", "w");

  int n, laux, i, st, dr, mij, val;

  n = fgetint();
  aux[0] = num[0] = fgetint();
  pos[0] = 0;
  laux = 1;
  for( i = 1 ; i < n ; i++ ){
    num[i] = fgetint();

    st = -1;
    dr = laux;
    aux[laux] = 2000000001;// santinela
    while( dr - st > 1 ){
      if( aux[mij = (st + dr) / 2] < num[i] )
        st = mij;
      else
        dr = mij;
    }

    laux = (dr + 1) > laux ? (dr + 1) : laux;
    pos[i] = dr;
    aux[dr] = num[i];
  }

  fputint(laux, '\n');

  // gasim elementele
  val = laux - 1;
  i = n - 1;
  while( val >= 0 ){
    if( pos[i] == val )
      elem[val--] = num[i];
    i--;
  }
  
  for( i = 0 ; i < laux ; i++ )
    fputint(elem[i], ' ');
  fputc('\n', fout);

  fclose(fin);
  fclose(fout);
  return 0;
}