Cod sursa(job #1743241)

Utilizator IgnitionMihai Moraru Ignition Data 17 august 2016 20:21:01
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <cstdint>
#include <vector>
#include <algorithm>

using namespace std;

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

  uint64_t N;
  scanf("%d", &N);
  vector<uint64_t> a(N), p(N), l(N+1);
  for(uint64_t i = 0; i < N; i++) {
    scanf("%d", &a[i]);
  }

  uint64_t L = 1;
  l[1] = 0;
  for(uint64_t i = 1; i < N; i++) {
    auto pos = equal_range(l.begin()+1, l.begin()+L+1, i,
        [=](auto x, auto y){return a[x] < a[y];}
    );
    if(pos.first != pos.second)
      continue; // element already exists
    uint64_t k = pos.first - l.begin();
    l[k] = i;
    p[i] = l[k-1];
    if(k > L)
      L = k;
  }
  
  printf("%d\n", L);
  vector<uint64_t> res(L);
  for(uint64_t i = 0, j = l[L]; i < L; i++, j = p[j])
    res[L-1-i] = a[j];
  for(uint64_t i = 0; i < L-1; i++)
    printf("%d ", res[i]);
  printf("%d\n", res[L-1]);

  return 0;
}