Cod sursa(job #3132886)

Utilizator SorinBossuMarian Sorin SorinBossu Data 24 mai 2023 10:24:54
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;

std::ifstream in("scmax.in");
std::ofstream out("scmax.out");

struct nod {
  int val;
  nod *next = nullptr;
};
nod a[200001], *poz;

std::vector<std::stack<nod *>> v;

int main() {
  int n;
  in >> n;

  poz = a;
  in >> poz->val;

  v.reserve(100001);
  v.emplace_back();
  v[0].emplace(poz);

  for (int i = 2; i <= n; ++i) {
    poz++;
    in >> poz->val;
    int st = 0, dr = v.size() - 1, p = -1;
    while (st <= dr) {
      int mij = (st + dr) / 2;
      if (v[mij].top()->val >= poz->val)
        dr = mij - 1, p = mij;
      else
        st = mij + 1;
    }
    if (p == -1) {
      v.emplace_back();
      v.back().emplace(poz);
      v.back().top()->next = v[v.size() - 2].top();
    } else {
      v[p].emplace(poz);
      if (p != 0)
        v[p].top()->next = v[p - 1].top();
    }
  }
  out << v.size() << "\n";
  stack<int> r;
  nod *pp = v.back().top();
  while (pp != nullptr) {
    r.emplace(pp->val);
    pp = pp->next;
  }
  while (!r.empty())
    out << r.top() << " ", r.pop();
  return 0;
}