Cod sursa(job #2696513)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 16 ianuarie 2021 08:11:58
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define NMAX 100000
FILE *fin, *fout;

int v[NMAX + 5], s[NMAX + 5], prev[NMAX + 5];

int cautbin(int e, int st, int dr) {
  int ind, step;
  ind = st - 1;
  step = 1 << 16;
  while (step){
    if (ind + step <= dr && v[s[ind + step]] < e)
      ind += step;
    step >>= 1;
  }
  return ind;
}

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

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

  int n, i, l, maxl;

  fscanf(fin, "%d", &n);
  for (i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);

  maxl = 0;
  for (i = 0; i < n; ++i) {
    l = cautbin(v[i], 0, maxl - 1) + 1;
    s[l] = i;

    if (l > 0)
      prev[i] = s[l - 1];
    else
      prev[i] = -1;

    if (l + 1 > maxl)
      maxl = l + 1;
  }

  fprintf(fout, "%d\n", maxl);
  write(s[maxl - 1]);
  fclose(fout);

  return 0;
}