Cod sursa(job #2684247)

Utilizator abcabc123abc abc abcabc123 Data 13 decembrie 2020 13:29:11
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 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;

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';
  int j = n;
  for (int i = lma; i >= 1; i--) {
    while (p[j] != i)
      j--;
    r[i] = a[j];
  }
  for (int i = 1; i <= lma; i++)
    fout << r[i] << ' ';
  return 0;
}