Cod sursa(job #2280920)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 11 noiembrie 2018 12:51:44
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 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<int> tail(NMAX, 0);
vector<int> pre(NMAX, -1);
int st[NMAX];


int ceilIndex(const vector<int> &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 = 1; 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;
      }
   }

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

   while (st_count > -1) {
      T elm = arr[st[st_count--]];
      printf("%lld ", elm);
   }

   return 0;
}