Cod sursa(job #2042096)

Utilizator danny794Dan Danaila danny794 Data 18 octombrie 2017 05:46:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 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++;
  } else if (values[solution[length]] > values[index]) {
    solution[length] = index;
  }
  previous[index] = length ? solution[length - 1] : -1;
}

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

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

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;
}