Cod sursa(job #2684450)

Utilizator abcabc123abc abc abcabc123 Data 13 decembrie 2020 18:46:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;

ifstream fin ("scmax.in");
ofstream fout ("scmax.out");

int n, a[100001], dp[100001], r[100001], p[100001], lma, st, dr, mij, poz, k, pozma;

int main()
{
  fin >> n;
  for (int i = 1; i <= n; i++)
    fin >> a[i];
  dp[++lma] = a[1]; p[1] = 1;
  for (int i = 2; i <= n; i++) {
    if (a[i] > dp[lma]) {
      dp[++lma] = a[i];
      p[i] = lma;
    }
    else {
      st = 1; dr = lma; poz = lma + 1;
      while (st <= dr) {
        mij = st + (dr - st) / 2;
        if (dp[mij] >= a[i]) {
          poz = mij;
          dr = mij - 1;
        }
        else
          st = mij + 1;
      }
      dp[poz] = a[i];
      p[i] = poz;
    }
  }
  fout << lma << '\n';
  for (int i = n; i >= 1; i--)
    if (p[i] == lma) {
      pozma = i;
      r[++k] = a[i];
      break;
    }
  for (int i = pozma - 1; i >= 1; i--)
    if (p[i] == p[pozma] - 1 and a[pozma] > a[i]) {
      pozma = i;
      r[++k] = a[i];
    }
  for (int i = lma; i >= 1; i--)
    fout << r[i] << ' ';
  return 0;
}