Cod sursa(job #2876693)

Utilizator AndreiV03Andrei Voicu AndreiV03 Data 23 martie 2022 14:07:13
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>
using namespace std;

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

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

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 mij = (st + dr) / 2;
      
      if (b[mij] > a[i])
        dr = mij - 1, poz = mij;
      else st = mij + 1;
    }
    
    b[poz] = a[i];
    p[i] = poz;
  }
  
  for (int i = k, j = n; i >= 1; --i) {
    while (p[j] != i) --j;
    q[i] = j;
  }
  
  cout << k << "\n";
  for (int i = 1; i <= k; ++i)
    cout << a[q[i]] << " ";

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