Cod sursa(job #1984606)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 25 mai 2017 15:03:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
const int MAXN = 100000;
using namespace std;
int v[MAXN + 1], sol[MAXN + 1], poz[MAXN + 1], scm[MAXN + 1];
int main()
{
  FILE *fin, *fout;
  int n, i, nr, st, dr, mm, m;
  fin = fopen ("scmax.in", "r");
  fout = fopen ("scmax.out", "w");
  fscanf (fin, "%d", &n);
  for (i = 1; i <= n; i++)
    fscanf (fin, "%d", &v[i]);
  sol[1] = v[1];
  poz[1] = 1;
  nr = 1;
  for (i = 2; i <= n; i++) {
    if (v[i] > sol[nr]) {
      nr++;
      sol[nr]  = v[i];
      poz[i] = nr;
    }
    else {
      st = 1;
      dr = nr;
      mm = -1;
      while (st <= dr) {
        m = (st + dr) / 2;
        if (sol[m] >= v[i]) {
          dr = m - 1;
          mm = m;
        }
        else {
          st = m + 1;
        }
      }
      sol[mm] = v[i];
      poz[i] = mm;
    }
  }
  i = n;
  n = nr;
  while (nr > 0) {
    if (poz[i] == nr) {
      scm[nr] = v[i];
      nr--;
    }
    i--;
  }
  fprintf (fout, "%d\n", n);
  for (i = 1; i <= n; i++)
    fprintf (fout, "%d ", scm[i]);
  fclose (fin);
  fclose (fout);
  return 0;
}