Cod sursa(job #2609725)

Utilizator juniorOvidiu Rosca junior Data 3 mai 2020 12:23:54
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct element {
  int l, lvp; // locul, locul vecinului preferat
};

ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, ns, a[100001], sol[100001], nes[10001], v[10001], ii[10001], vv, lv;
element s[100001];
bool gasita;

int lvp(int is) {
  if (is >= 1) {
    return nes[is - 1];
  }
  else {
    return -1;
  }
}

int main() {
  fin >> n;
  ns = -1;
  for (int i = 1; i <= n; i++) {
    fin >> a[i];
    gasita = false;
    for (int is = 0; is <= ns and not gasita; is++) {
      if (a[i] <= v[is]) {
        nes[is]++; v[is] = a[i]; gasita = true;
      }
    }
    if (not gasita) {
      ns++; nes[ns] = 1; v[ns] = a[i];
    }
  }
  ii[0] = 0;
  for (int is = 1; is <= ns; is++)
    ii[is] = ii[is - 1] + nes[is - 1]; // indicele de inceput al stivei
  ////
  for (int is = 1; is <= ns; is++)
    nes[is] = -1;
  ns = -1;
  for (int i = 1; i <= n; i++) {
    gasita = false;
    for (int is = 0; is <= ns and not gasita; is++) {
      vv = a[s[ii[is] + nes[is]].l];
      if (a[i] <= vv) {
        nes[is]++; s[ii[is] + nes[is]] = {i, lvp(is)}; gasita = true;
      }
    }
    if (not gasita) {
      ns++; nes[ns] = 0; s[ii[ns]] = {i, lvp(ns)};
    }
  }
  fout << ns << '\n';
  lv = nes[ns];
  for (int is = ns; is >= 0; is--) {
    sol[is] = a[s[ii[is] + lv].l];
    lv = s[ii[is] + lv].lvp;
  }
  for (int i = 0; i <= ns; i++)
    fout << sol[i] << ' ';
  return 0;
}