Cod sursa(job #1817813)

Utilizator tudorcomanTudor Coman tudorcoman Data 28 noiembrie 2016 15:16:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxN = 100000;
int N, v[maxN + 1], p[maxN + 1];
vector<int> q, sol;

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

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

  p[1] = 1;
  q.push_back(v[1]);

  for(int i = 1; i <= N; ++ i) {
    auto ptr = lower_bound(q.begin(), q.end(), v[i]);
    if(ptr == q.end()) {
      q.push_back(v[i]);
      p[i] = q.size() - 1;
    } else
      q[p[i] = ptr - q.begin()] = v[i];
  }

  printf("%d\n", q.size());
  int target = q.size() - 1;
  for(int i = N; i; -- i) {
    if(p[i] == target) {
      sol.push_back(v[i]);
      -- target;
    }
  }

  for(auto it = sol.rbegin(); it != sol.rend(); ++ it)
    printf("%d ", *it);
  printf("\n");
  return 0;
}