Cod sursa(job #813463)

Utilizator ciorile.chioareBogatu Adrian ciorile.chioare Data 15 noiembrie 2012 16:24:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>


FILE* in;
FILE* out;

template<class T>
int binary_search(T* v, int *index, int a, int b, const T& value) {
  if(a == b) {
    return (!(v[index[a]] < value))?(a):(a + 1);
  }
  int mid = (a + b) / 2;
  if(v[index[mid]] < value) {
    return binary_search(v, index, mid + 1, b, value);
  }
  else {
    return binary_search(v, index, a, mid, value);
  }
}

/*
 *  Functia care determina un subsir crescator maximal dintr-un vector
 */
void scmax(int *v, int &n) {
  int j;

  int *best = new int[n + 1];
  int *m = new int[n];
  int *prev = new int[n + 1];
  int jmax = 0;

  best[1] = 1;
  prev[1] = 0;
  m[0] = 0;
  int imax = 1;
  for(int i = 1; i <= n; ++i) {
    j = binary_search(v, m, 0, imax, v[i]);
    best[i] = j;
    if(best[i] > best[jmax])
      jmax = i;
    prev[i] = m[j - 1];
    m[j] = i;
    if(j > imax)
      imax++;
  }
  int *rez = new int[imax + 1];
  j = 0;
  rez[j++] = jmax;
  for(int i = jmax; prev[i]; i = prev[i]) {
    rez[j] = prev[i];
    j++;
  }

  fprintf(out, "%d\n", imax - 1);
  for(int i = j - 1; i >= 0; --i)
    fprintf(out, "%d ", v[rez[i]]);
  fprintf(out, "\n");
}

int main() {


  //FILE *in = fopen(argv[0], "r");
  //FILE *out = fopen(argv[1], "w");
  in = fopen("scmax.in", "r");
  out = fopen("scmax.out", "w");

  int n;

  fscanf(in, "%d", &n);

  int *price = new int[n + 1];
  for(int i = 1; i <= n; ++i) {
    fscanf(in, "%d", price + i);
  }

  scmax(price, n);

  fclose(in);
  fclose(out);
  return 0;
}