Cod sursa(job #2901400)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 13 mai 2022 17:43:55
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>

int v[100000];
int l[100000];

int main() {
  FILE *fin, *fout;
  int n;
  int i, mijloc;
  int stanga, dreapta;
  int res;

  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++)
    l[i] = 2000000000;

  res = 1;
  l[1] = v[0];
  for (i = 0; i < n; i++) {
    stanga = 1;
    dreapta = res + 1;
    while (dreapta - stanga > 1) {
      mijloc = (stanga + dreapta) / 2;
      if (l[mijloc] > v[i])
        dreapta = mijloc;
      else
        stanga = mijloc;
    }
    if (l[stanga] < v[i]) {
      stanga++;
      res++;
    }
    if (l[stanga] > v[i]) {
      l[stanga] = v[i];
    }
  }

  fout = fopen("scmax.out", "w");

  res = 0;
  for (i = 1; i <= n; i++)
    if (l[i] < 2000000000)
      res++;
  fprintf(fout, "%d\n", res - 1);
  for (i = 1; i < res; i++)
    fprintf(fout, "%d ", l[i]);

  fclose(fout);

  return 0;
}