Cod sursa(job #2041307)

Utilizator danny794Dan Danaila danny794 Data 17 octombrie 2017 06:36:02
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

#define NMAX 100005

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

int values[NMAX], solution[NMAX], previous[NMAX], currentMax = -1, n;

void save(int index, int length) {
  if (length > currentMax) {
    solution[length] = index;
    currentMax = length;
  } else if (values[solution[length]] > values[index]) {
    solution[length] = index;
  }
  previous[index] = length == 0 ? -1 : solution[length - 1];
}

void find(int left, int right, int index) {
  if (left == right) {
    save(index, left);
  } else if (right - left == 1) {
    if (values[index] > values[solution[left]] || values[index] > values[previous[right]]) {
      find(right, right, index);
    } else {
      find(left, left, index);
    }
  } else {
    int mid = (left + right) / 2;
    if (values[solution[mid]] < values[index]) {
      find(mid, right, index);
    } else {
      find(left, mid, index);
    }
  }
}

void printSolution(int idx) {
  if (idx == -1) {
    return;
  }
  printSolution(previous[idx]);
  cout << values[idx] << " ";
}

int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> values[i];
    find(0, currentMax + 1, i);
  }
  cout << currentMax + 1 << "\n";
  printSolution(solution[currentMax]);
  return 0;
}