Pagini recente » Cod sursa (job #653523) | Cod sursa (job #3174954) | Cod sursa (job #2426600) | Cod sursa (job #1400641) | Cod sursa (job #2743961)
#include<algorithm>
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int INF = INT_MAX;
vector<int> elements;
bool comparator(int searched, int index) {
/* if (elements[searched] == elements[index]) {
return false;
}*/
return elements[searched] < elements[index];
}
void printSeq(vector<int> predecessor, int index) {
if (predecessor[index] == -1) {
fout << elements[index] << " ";
return;
}
printSeq(predecessor, predecessor[index]);
fout << 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);
// indecsii celor mai mici elemente care inchid un subsir de lungime <ID+1>
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";
printSeq(predecessor, lowestEndIndexes[lowestEndIndexes.size() - 1]);
}