Cod sursa(job #2418311)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 4 mai 2019 16:26:26
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h>
#define NMAX 100000
#define INFINIT 2000000001

int scm[ 1 + NMAX ] ;
int s[ 1 + NMAX ] ;
int poz[ 1 + NMAX ] ;
int last[ NMAX + 1 ] ;
int v[ NMAX + 1 ] ;
int rez[ NMAX + 1 ] ;

int bs (int st, int dr, int val) {
  int mid;
  dr++;
  while(dr - st > 1) {
    mid = (st + dr) / 2;
    if(s[mid] < val)
      st = mid;
    else
      dr = mid;
  }
  return st;
}

int main() {
  FILE *fin = fopen("scmax.in", "r") ;
  FILE *fout = fopen("scmax.out", "w") ;
  int n, maxim, i, pozmax, j;
  fscanf(fin, "%d", &n);
  for(i = 0 ; i < n ; i++ ) {
    s[i] = INFINIT ;
    poz[i] = -1 ;
  }
  maxim = 0;
  pozmax = 0;

  for(i = 0 ; i < n ; i++ ) {
    fscanf(fin, "%d", &v[i]) ;
    scm[i] = bs(0 , maxim, v[i]) + 1 ;
    last[i] = poz[ scm[i] - 1 ];
    if( scm[i] > maxim ) {
      maxim = scm[i];
      pozmax = i;
    }
    if( v[i] < s[scm[i]] ) {
      s[scm[i]] = v[i];
      poz[scm[i]] = i;
    }
  }
  i = pozmax ;
  j = maxim - 1 ;
  while( i >= 0 ) {
    rez[j] = v[i];
    i = last[i];
    j--;
  }
  fprintf(fout, "%d\n", maxim);
  for(i = 0; i < maxim; i++)
    fprintf(fout, "%d ", rez[i]);
  fclose(fin);
  fclose(fout);
  return 0;
}