Cod sursa(job #3337149)

Utilizator calinulCalin Cernat calinul Data 26 ianuarie 2026 22:50:39
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>

int d[100000], v[100000], prev[100000];

FILE *fin, *fout;

int cautBin( int st, int dr, int x ) {
  int mj;
  while ( st + 1 < dr ) {
    mj = (st + dr) / 2;
    if ( v[d[mj]] < x )
      st = mj;
    else
      dr = mj;
  }
  return dr;
}

void write( int pos ) {
  if ( pos != -1 ) {
    write( prev[pos] );
    fprintf( fout, "%d ", v[pos] );
  }
}

int main() {
  int n, i, pos, lmax = 0;

  fin = fopen( "scmax.in", "r" );
  fscanf( fin, "%d", &n );
  for ( i = 0; i < n; i++ )
    fscanf( fin, "%d", &v[i] );
  fclose( fin );

  for ( i = 0; i < n; i++ ) {
    pos = cautBin( -1, lmax, v[i] );
    d[pos] = i;
    prev[i] = pos > 0 ? d[pos - 1] : -1;
    if ( lmax == pos )
      lmax++;
  }

  fout = fopen( "scmax.out", "w" );
  fprintf( fout, "%d\n", lmax );
  write( d[lmax - 1] );
  fputc( '\n', fout );
  fclose( fout );

  return 0;
}