Cod sursa(job #1072053)

Utilizator andra23Laura Draghici andra23 Data 3 ianuarie 2014 21:16:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb

#include<algorithm>
#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

int bsearch(const vector<int>& a, const vector<int>& m,
    int left, int right, int x) {
  int result = -1;
  while (left <= right) {
    int mid = (left+right)/2;
    if (a[m[mid]] < x) {
      result = mid;
      left = mid+1;
    } else {
      right = mid-1;
    }
  }
  return result;
}

vector<int> longestIncrSubseq(const vector<int>& a) {
  vector<int> result;
  vector<int> m(a.size()), p(a.size());
  m[0] = 0;
  p[0] = -1;
  int maxlen = 0;
  for (int i = 1; i < a.size(); i++) {
    int pos = bsearch(a, m, 0, maxlen, a[i]);
    if (pos == -1) {
      p[i] = -1;
    } else {
      p[i] = m[pos];
    }
    m[pos+1] = i;
    maxlen = max(maxlen, pos+1);
  }

  int current = m[maxlen];
  while (current != -1) {
    result.push_back(a[current]);
    current = p[current];
  }
  reverse(result.begin(), result.end());
  return result;
}

int main() {
  ifstream f("scmax.in");
  ofstream g("scmax.out");
  int n;
  f >> n;
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    f >> a[i];
  }

  vector<int> result = longestIncrSubseq(a);
  g << result.size() << endl;
  for (int x : result) {
    g << x << " ";
  }
  g << endl;

  return 0;
}