Cod sursa(job #1743243)

Utilizator IgnitionMihai Moraru Ignition Data 17 august 2016 20:23:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <cstdint>
#include <vector>

using namespace std;

uint64_t N;
vector<uint64_t> a;
vector<uint64_t> p;
vector<uint64_t> l;
// l[i] == index of smallest element ending a seq of len i 
uint64_t L;

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

  scanf("%d", &N);
  a.resize(N);
  for(uint64_t i = 0; i < N; i++) {
    scanf("%d", &a[i]);
  }

  p.resize(N+1);
  l.resize(N+1);
  l[1] = 0;
  L = 1;
  for(uint64_t i = 1; i < N; i++) {
    uint64_t lo = 1, hi = L;
    uint64_t ignore = 0;
    while(lo <= hi) {
      uint64_t m = (lo+hi)/2;
      if(a[i] < a[l[m]])
        hi = m-1;
      else if(a[i] > a[l[m]])
        lo = m+1;
      else { ignore = 1; break; }
    }
    if(ignore)
      continue;
    l[lo] = i;
    p[i] = l[lo-1];
    if(lo > L)
      L = lo;
  }
  printf("%d\n", L);
  // for(uint64_t i = 0; i <= L; i++) {
  //   printf("l[%d] = %d\n", i, l[i]);
  // }
  // printf("\n");
  // for(uint64_t i = 0; i < N; i++) {
  //   printf("p[%d] = %d\n", i, p[i]);
  // }
  vector<uint64_t> res(L);
  for(int64_t i = L-1, j = l[L]; i >= 0; i--) {
    res[i] = a[j];
    j = p[j];
  }
  for(uint64_t i = 0; i < L-1; i++)
    printf("%d ", res[i]);
  printf("%d\n", res[L-1]);

  return 0;
}