Cod sursa(job #1997812)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 5 iulie 2017 13:48:32
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

int find_poz(int best, int i, vector< int > &v, vector< int > &partial) {
  int st = 1;
  int dr = best;
  int mid;
  while(st <= dr) {
    mid = (st + dr) >> 1;
    if(v[i] <= v[partial[mid]]) {
      if(v[i] > v[partial[mid - 1]]) {
        if(mid + 1 > best)
          return mid;
        else if(v[i] < v[partial[mid + 1]])
          return mid;
      }
      dr = mid - 1;
    }
    else
      st = mid + 1;
  }
}

void remake(int poz, int len_max, vector< int > &v, vector< int > &partial, vector< int > &prev) {
  if(len_max == 0)
    return;
  else {
    remake(prev[poz], len_max - 1, v, partial, prev);
    cout << v[prev[poz]] << ' ';
  }
}

int main() {
  int n;
  cin >> n;
  vector< int > v(n + 1);
  vector< int > partial(n + 1);
  vector< int > prev(n + 2);
  int len_max = 0;
  partial[0] = 0;
  v[0] = -1;
  for(int i = 1; i <= n; i ++) {
    cin >> v[i];
    if(v[i] > v[partial[len_max]]) {
      len_max ++;
      partial[len_max] = i;
      prev[i] = partial[len_max - 1];
    }
    else if(v[i] == v[partial[len_max]]) {
      int aux = prev[partial[len_max]];
      partial[len_max] = i;
      prev[partial[len_max]] = aux;
    }
    else {
      int k = find_poz(len_max, i, v, partial);
      int aux = prev[partial[k]];
      partial[k] = i;
      prev[partial[k]] = aux;
    } 
  }

  cout << len_max << '\n';
  prev[n + 1] = partial[len_max];
  remake(n + 1, len_max, v, partial, prev);
}