Cod sursa(job #3200116)

Utilizator Minea_TheodorMinea Theodor Stefan Minea_Theodor Data 3 februarie 2024 16:07:52
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>

#define MAX_N 100000

FILE *fin, *fout;
int v[MAX_N], s[MAX_N], pred[MAX_N];

inline int max(int a, int b) {
  return a > b ? a : b;
}

int binarySearch(int searchValue, int left, int right) {
  int i, step;
  i = left - 1;
  step = 1 << 16;
  while (step) {
    if (i + step <= right && v[s[i + step]] < searchValue)
      i += step;
    step >>= 1;
  }
  return i;
}

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

int main() {
  int n, i, length, maxLength;

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

  maxLength = 0;
  for (i = 0; i < n; ++i) {
    length = binarySearch(v[i], 0, maxLength - 1) + 1;
    s[length] = i;

    pred[i] = length > 0 ? s[length - 1] : -1;
    maxLength = max(maxLength, length + 1);
  }

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

  return 0;
}