Cod sursa(job #2628010)

Utilizator euyoTukanul euyo Data 13 iunie 2020 21:30:28
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>

int d[100001];
int poz[100001];
int prev[100001];
int v[100001];
int aux[100001];

int cautbin( int n, int e ) {
  int st = 0, dr = n, mij;
  
  while ( dr - st > 1 ) {
    mij = (st + dr) / 2;
    if ( d[mij] > e ) {
      dr = mij;
	} else {
      st = mij;
    }	
  }
  return st;
}

int main() {
  FILE *fin = fopen( "scmax.in", "r" );
  FILE *fout = fopen( "scmax.out", "w" );
  int n, i, a, len, pos, j, ant, l;

  fscanf( fin, "%d%d", &n, &a );
  len = 0;
  v[0] = a;
  poz[len] = 0;
  d[len++] = a;
  for ( i = 1; i < n; ++i ) {
	fscanf( fin, "%d", &a );
	v[i] = a;
    if ( a > d[len - 1] ) {
	  prev[i] = poz[len - 1]; 
	  poz[len] = i;
	  d[len++] = a;
	} else {
	  pos = cautbin( len, a );
	  if ( d[pos] < a ) {
		++pos;
	  }
	  d[pos] = a;
	  poz[pos] = i;
	  if ( pos >= 1 ) {
        prev[i] = poz[pos - 1];
	  }
    }
  }
  fprintf( fout, "%d\n", len );
  i = poz[len - 1];
  l = 0;
  while ( l < len ) {
	aux[l] = v[i]; 
	++l;
	i = prev[i];
  }
  for ( i = len - 1; i >= 0; --i ) {
	fprintf( fout, "%d ", aux[i] );
  }
  fclose( fin ); 
  fclose( fout );
  return 0;
}