Cod sursa(job #2280870)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 11 noiembrie 2018 12:08:46
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>

using namespace std;
typedef long long T;

const int NMAX = 100005;
const long long VALMAX = 2000003;

int N;

vector<T> arr(NMAX);
vector<T> tail(NMAX, 0);
vector<T> pre(NMAX, -1);
stack<T> st;


int ceilIndex(const vector<T> &tail, const vector<T> &arr, int l, int r, T val) {
   while (l + 1 < r) {
      int m = l + (r - l) / 2;
      if (arr[tail[m]] <= val) {
         l = m;
      } else {
         r = m;
      }
   }

   return r;
}

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

   scanf("%d", &N);

   for (int i = 0; i < N; ++i) {
      scanf("%lld", &arr[i]);
      tail[i] = 0;
   }

   int L = 0;
   int p = 0;

   for (int i = 0; i < N; ++i) {
      if (arr[i] < arr[tail[0]]) {
         tail[0] = i;
      } else if (arr[i] > arr[tail[L]]) {
         pre[i] = tail[L];
         tail[++L] = i;
         p = i;
      } else {
         int pos = ceilIndex(tail, arr, -1, L, arr[i]);
         pre[i] = tail[pos - 1];
         tail[pos] = i;
      }
   }

   printf("%d\n",L+1);
   while (p != -1) {
      st.push(arr[p]);
      p = pre[p];
   }

   while (!st.empty()) {
      T elm = st.top();
      st.pop();
      printf("%lld ", elm);
   }

   return 0;
}