Pagini recente » Cod sursa (job #1964997) | Cod sursa (job #2847694) | Cod sursa (job #2132729) | Cod sursa (job #1454800) | Cod sursa (job #2743975)
#include<algorithm>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> elements;
bool comparator(int searched, int index) {
return elements[searched] < elements[index];
}
int main() {
int noElem;
fin >> noElem;
for (int index = 0; index < noElem; ++index) {
int elem;
fin >> elem;
elements.push_back(elem);
}
vector<int> lowestEndIndexes;
vector<int> predecessor(noElem, -1);
lowestEndIndexes.push_back(0);
for (int index = 1; index < noElem; ++index) {
auto binarySearchResult = lower_bound(lowestEndIndexes.begin(),
lowestEndIndexes.end(),
index,
comparator);
int position = binarySearchResult - lowestEndIndexes.begin();
if (binarySearchResult == lowestEndIndexes.end()) {
lowestEndIndexes.push_back(index);
} else {
*binarySearchResult = index;
}
if (binarySearchResult != lowestEndIndexes.begin()) {
predecessor[index] = lowestEndIndexes[position - 1];
}
}
fout << lowestEndIndexes.size() << "\n";
int index = lowestEndIndexes[lowestEndIndexes.size() - 1];
lowestEndIndexes.clear();
while (1) {
if (index == -1) {
break;
}
lowestEndIndexes.push_back(index);
index = predecessor[index];
}
for (index = lowestEndIndexes.size() - 1; index >= 0; --index) {
fout << elements[lowestEndIndexes[index]] << " ";
}
}