Cod sursa(job #998274)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 16 septembrie 2013 17:38:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

int ne, dad[100005], mnum[100005], el[100005], best[100005];

int bs(int val){
  int left = 1, right = ne, last = 0, mid;
  while(left <= right){
    mid = (left + right) / 2;
    if(el[mnum[mid]] >= val)
      right = mid - 1;
    else{
      left = mid + 1;
      last = mid;
    }
  }
  return last;
}

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

  int n;
  scanf("%d", &n);
  el[0] = 2e9;

  best[1] = 1;
  ne = 1;
  scanf("%d", &el[1]);
  mnum[1] = 1;

  for(int i = 2; i <= n; ++i){
    scanf("%d", &el[i]);

    int pos = bs(el[i]);
    best[i] = pos + 1;
    ne = max(ne, pos + 1);

    if(el[i] < el[mnum[pos + 1]])
      mnum[pos + 1] = i;
    dad[i] = mnum[pos];
  }

  vector<int> ans;

  int p = mnum[ne];
  while(p){
    ans.push_back(el[p]);
    p = dad[p];
  }

  printf("%d\n", (int)ans.size());
  for(int i = ans.size() - 1; i >= 0; --i)
    printf("%d ", ans[i]);

  return 0;
}