Cod sursa(job #2943845)

Utilizator ptlsebiptl sebi ptlsebi Data 21 noiembrie 2022 18:25:21
Problema Subsir crescator maximal Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>
#include <stdint.h>

void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
  uint8_t ch;
  *nr = 0;
  while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
    *nr *= 10;
    *nr += ch - '0';
  }
  if (ch == '\r') {
    fgetc(stream);
  }
}

uint32_t __inline__ __attribute((pure)) max(uint32_t o1, uint32_t o2) {
  return o1 > o2 ? o1 : o2;
}

uint32_t a[100002];
uint32_t m[100002];
uint32_t l[100002];

uint32_t bsrc(uint32_t *__restrict vec, uint32_t lbound, uint32_t ubound, uint32_t threshold) {
  uint32_t cpos;
  uint32_t answer = lbound - 1;
  while (lbound <= ubound) {
    cpos = (ubound + lbound) / 2;
    if (vec[cpos] < threshold) {
      answer = cpos;
      lbound = cpos + 1;
    } else {
      ubound = cpos - 1;
    }
  }
  return answer;
}

uint32_t n;
void ps(uint32_t i, uint32_t pv, uint32_t pl, FILE *__restrict out) {
  if (pl == 0) {
    return;
  }
  if (a[i] < pv && l[i] == pl) {
    ps(i - 1, a[i], pl - 1, out);
    fprintf(out, "%u ", a[i]);
  } else {
    ps(i - 1, pv, pl, out);
  }
}

int main(void) {
  {
    FILE *__restrict in = fopen("scmax.in", "r");
  
    read_uint32_t(in, &n);
    {
      int32_t i;
      for(i = 0; i < n; ++i) {
        read_uint32_t(in, a + i);
      }
    }
  
    fclose(in);
  }

  uint32_t cl = 1;
  l[0] = 1;
  m[1] = a[0];

  {
    int32_t i, h;
    for(i = 1; i < n; ++i) {
      h = bsrc(m, 1, cl, a[i]) + 1;
      m[h] = a[i];
      cl = max(cl, h);
      l[i] = h;
    }
  }

  uint32_t ma = 0;
  uint32_t p = 0;
  {
    int32_t i;
    for(i = 0; i < n; ++i) {
      //fprintf(stdout, "%2u %2u %2u\n", a[i], l[i], m[i]);
      if (l[i] > ma) {
        ma = l[i];
        p = i;
      }
    }
  }

  {
    FILE *__restrict out = fopen("scmax.out", "w");
  
    fprintf(out, "%u\n", ma);
    ps(p, a[p] + 1, ma, out);
  
    fclose(out);
  }


  return 0;
}