Cod sursa(job #2072289)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 21 noiembrie 2017 17:53:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 100005;
int v[NMAX];
int poz[NMAX];
int sol[NMAX];
vector <int> vec;

int main() {
  int n;
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);
  scanf("%d", &n);
  for(int i = 1; i <= n; ++i) {
    scanf("%d", &v[i]);
  }
  vec.push_back(v[1]);
  for(int i = 2; i <= n; ++i) {
    auto it = lower_bound(vec.begin(), vec.end(), v[i]);
    if(it == vec.end()) {
      vec.push_back(v[i]);
      poz[i] = vec.size() - 1;
    }
    else {
      poz[i] = it - vec.begin();
      vec[poz[i]] = v[i];
    }
  }
  int nr = vec.size() - 1;
  for(int i = n; i; --i) {
    if(nr == poz[i]) {
      sol[++sol[0]] = v[i];
      --nr;
    }
  }
  printf("%d\n", sol[0]);
  while(sol[0]) {
    printf("%d ", sol[sol[0]--]);
  }
  printf("\n");
  return 0;
}