Pagini recente » Cod sursa (job #1848517) | Cod sursa (job #756571) | Cod sursa (job #1159653) | Cod sursa (job #2940158) | Cod sursa (job #2743967)
#include<algorithm>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> elements;
bool comparator(short searched, short index) {
/* if (elements[searched] == elements[index]) {
return false;
}*/
return elements[searched] < elements[index];
}
void printSeq(vector<short> predecessor, short index) {
if (predecessor[index] == -1) {
fout << elements[index] << " ";
return;
}
printSeq(predecessor, predecessor[index]);
fout << elements[index] << " ";
}
int main() {
short noElem;
fin >> noElem;
for (short index = 0; index < noElem; ++index) {
int elem;
fin >> elem;
elements.push_back(elem);
}
vector<short> lowestEndIndexes;
vector<short> predecessor(noElem, -1);
lowestEndIndexes.push_back(0);
// indecsii celor mai mici elemente care inchid un subsir de lungime <ID+1>
for (short index = 1; index < noElem; ++index) {
auto binarySearchResult = lower_bound(lowestEndIndexes.begin(),
lowestEndIndexes.end(),
index,
comparator);
short 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";
printSeq(predecessor, lowestEndIndexes[lowestEndIndexes.size() - 1]);
}