Cod sursa(job #1521468)

Utilizator tudorcomanTudor Coman tudorcoman Data 10 noiembrie 2015 15:23:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb

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

const int maxN = 1e5;
int N, v[maxN + 1], p[maxN + 1], q[maxN + 1];
int main() {
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);
  scanf("%d", &N);
  for(register int i = 1; i <= N; ++ i)
    scanf("%d", &v[i]);

  q[1] = v[1]; p[1] = 1;
  int sq = 1;
  for(register int i = 1; i <= N; ++ i) {
    int *ptr = lower_bound(q + 1, q + sq + 1, v[i]);
    if(ptr == q + sq + 1)
      q[++ sq] = v[i], p[i] = sq;
    else
      q[ptr - q] = v[i], p[i] = ptr - q;
  }

  printf("%d\n", sq);
  int target = sq;
  stack<int> sol;
  for(register int i = N; i > 0; -- i) {
    if(p[i] == target) {
      sol.push(v[i]);
      -- target;
    }
  }
  while(!sol.empty())
    printf("%d ", sol.top()), sol.pop();
  return 0;
}