Cod sursa(job #2876937)

Utilizator AndreiV03Andrei Voicu AndreiV03 Data 23 martie 2022 21:37:26
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
using namespace std;

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

int n, k, a[100001], b[100001], c[100001], p[100001];

int main() {
  cin >> n;
  for (int i = 1; i <= n; ++i)
    cin >> a[i];

  b[++k] = a[1], p[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (a[i] > b[k]) {
      b[++k] = a[i], p[i] = k;
      continue;
    }
    
    int st = 1, dr = k, poz = k + 1;
    while (st <= dr) {
      int m = (st + dr) / 2;
      
      if (b[m] > a[i])
        dr = m - 1, poz = m;
      else st = m + 1;
    }
    
    b[poz] = a[i];
    p[i] = poz;
  }
  
  for (int i = k, j = n; i >= 1; --i) {
    while (p[j] != i) --j;
    c[i] = a[j];
  }
  
  cout << k << "\n";
  for (int i = 1; i <= k; ++i)
    cout << c[i] << " ";

  cin.close();
  cout.close();
  return 0;
}