Cod sursa(job #2694618)

Utilizator YusyBossFares Yusuf YusyBoss Data 9 ianuarie 2021 23:01:20
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <stdio.h>
#define NMAX 100000
#define VALMAX 2000000000

using namespace std;

FILE *fin, *fout;
int v[NMAX + 1], s[NMAX + 1], prev1[NMAX + 1];

int bs(int st, int dr, int val) {
  int i, pas;

  i = st - 1;
  pas = (1 << 16);

  while (pas) {
    if (i + pas <= dr && v[s[i + pas]] < val)
      i += pas;
    pas >>= 1;
  }

  return i + 1;
}

void afis(int poz) {
  if (poz == -1)
    return;
  afis(prev1[poz]);
  fprintf(fout, "%d ", v[poz]);
}

int main() {
  int n, i, j, scmax, poz;

  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++)
    s[i] = VALMAX + 1;

  scmax = 0;
  for (i = 0; i < n; i++) {
    poz = bs(0, scmax - 1, v[i]);
    s[poz] = i;

    prev1[i] = -1;
    if (poz > 0)
      prev1[i] = s[poz - 1];

    if (poz + 1 > scmax)
      scmax = poz + 1;
  }

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

  fprintf(fout, "%d\n", scmax);
  afis(s[scmax - 1]);

  fclose( fout );
  return 0;
}