Cod sursa(job #3157328)

Utilizator victorzarzuZarzu Victor victorzarzu Data 15 octombrie 2023 12:44:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <bits/stdc++.h>

using namespace std;

#define N_MAX 100005
ifstream f("scmax.in");
ofstream g("scmax.out");

int n;
int t[N_MAX], d[N_MAX], v[N_MAX];

void read() {
  f>>n;
  for(int i = 1;i <= n;++i) {
    f>>v[i];
  }
}

void reconstruct(const int& x) {
  if(t[x]) {
    reconstruct(t[x]);
  }
  g<<v[x]<<" ";
}

void solve() {
  int len = 1;
  d[1] = 1;
  int left, right, mid;

  for(int i = 2;i <= n;++i) {
    left = 1, right = len;
    while(left <= right) {
      mid = (left + right) >> 1;

      if(v[d[mid]] >= v[i]) {
        right = mid - 1;
      } else {
        left = mid + 1;
      }
    }

    if(len < left) {
      ++len;
      d[len] = i;
      t[i] = d[len - 1];
    } else {
      d[left] = i;
      t[i] = d[left - 1];
    }
  }

  g<<len<<'\n';
  reconstruct(d[len]);
}

int main() {
  
  read();
  solve();

  return 0;
}