Cod sursa(job #2518052)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 4 ianuarie 2020 20:19:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> v, pos, DP, daddy, 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 k = lower_bound(DP.begin(), DP.end(), v[i]) - DP.begin();

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

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

  
  int k = pos.back();
  while (k != -1) {
    answer.emplace_back(v[k]);
    k = daddy[k];
  }

  reverse(answer.begin(), answer.end());
  printf("%d\n", (int)answer.size());
  for (auto it : answer)
    printf("%d ", it); 
  
  return 0;
}