Pagini recente » Cod sursa (job #1499671) | Cod sursa (job #1901326) | Cod sursa (job #566876) | Cod sursa (job #1299750) | Cod sursa (job #2042096)
#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;
}