Cod sursa(job #1997516)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 4 iulie 2017 16:30:27
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>

using namespace std;

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

int get_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]] and v[partial[mid - 1]] < v[i])
      return mid;
    else if(v[i] > v[partial[mid]])
      st = mid + 1;
    else if(v[i] <= v[partial[mid]] and v[partial[mid - 1]] > v[i])
      dr = mid - 1;
  }
} 

int main() {
  int n;
  cin >> n;
  vector< int > v(n + 1);
  vector< int > partial(n + 1);
  vector< int > prev(n + 1);

  int best = 0;
  v[0] = -1;
  partial[0] = 0;
  prev[0] = -1;
  for(int i = 1; i <= n; i ++) {
    cin >> v[i];
    if(v[i] > v[partial[best]]) {
      best ++;
      partial[best] = i;
      prev[best] = i;
    }
    else if(v[i] == v[partial[best]]) { 
      partial[best] = i;
      prev[best] = i;
    }
    else {
      int k = get_poz(best, i, v, partial);
      partial[k] = i;
      if(prev[k - 1] < i)
        if(k + 1 <= best) {
          if(i < k + 1)
            prev[k] = 1;
        }
        else
          prev[k] = i;
    }
  }

  cout << best << '\n';
  for(int i = 1; i <= best; i ++)
    cout << v[prev[i]] << ' ';
  cout << '\n';
}