Pagini recente » Cod sursa (job #1428531) | Cod sursa (job #117925) | Cod sursa (job #1909246) | Cod sursa (job #1581624) | Cod sursa (job #2041307)
#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;
}