Cod sursa(job #2756738)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 2 iunie 2021 18:51:14
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

int N;
vector<int> v, DP, daddy, pos, answer;

int main()
{
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);

  int N;
  scanf("%d", &N);

  v.resize(N);
  daddy.resize(N);

  for (int i = 0; i < N; ++i) {
    scanf("%d", &v[i]);

    int pz = lower_bound(DP.begin(), DP.end(), v[i]) - DP.begin();

    if (pz == DP.size()) {
      pos.emplace_back(i);
      DP.emplace_back(v[i]);
    }
    else {
      pos[pz] = i;
      DP[pz] = v[i];
    }


    if (pz > 0)
      daddy[i] = pos[pz-1];
    else
      daddy[i] = -1;
  }

  int pz = pos.back();
  while (pz != -1) {
    answer.emplace_back(v[pz]);
    pz = daddy[pz];
  }
  
  reverse(answer.begin(), answer.end());
  printf("%d\n", (int)answer.size());
  for (auto it: answer)
    printf("%d ", it);
  
  return 0;
}