Cod sursa(job #2883114)

Utilizator MatyPopescu Matei Alexandru Maty Data 1 aprilie 2022 10:33:04
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <algorithm>
#define NMAX 100000
#define VALMAX 2000000000
#define INF 2100000000

using namespace std;

ifstream cin ("scmax.in");
ofstream cout ("scmax.out");

int v[NMAX + 1];
int vlastval[NMAX + 1]; /// vlastval[i] -- valoarea in care subsirul crescator de lungimea i se opreste
int vprev[NMAX + 1]; /// vprev[i] -- pozitia elementului dinainte lui i in subsirul de lungime maxima care se termina pe pozitia i
int vindex[NMAX + 1]; /// vindex[i] -- indexul in care subsecventa de lungime i se termina
int vsol[NMAX + 1];

int main() {
  int n, val, i, j, poz, scmax, lastscmax, nsol;
  cin >> n;

  vlastval[0] = -INF;
  vindex[0] = -1;
  for (i = 1; i <= n; i++)
    vlastval[i] = INF;

  scmax = 0;
  for (i = 0; i < n; i++) {
    cin >> val;
    v[i] = val;

    poz = upper_bound(vlastval, vlastval + n + 1, val) - vlastval;
    if (vlastval[poz] > val && val > vlastval[poz - 1]) {
      vlastval[poz] = val;
      vindex[poz] = i;
      vprev[i] = vindex[poz - 1];

      if (poz > scmax)
        scmax = poz, lastscmax = i;
    }
  }

  cout << scmax << "\n";

  nsol = 0;
  while (lastscmax >= 0) {
    vsol[nsol++] = v[lastscmax];
    lastscmax = vprev[lastscmax];
  }

  for (i = nsol - 1; i >= 0; i--)
    cout << vsol[i] << " ";
  return 0;
}