Pagini recente » Cod sursa (job #1743516) | Cod sursa (job #558470) | Cod sursa (job #1963270) | Cod sursa (job #1287873) | Cod sursa (job #3309099)
#include <fstream>
#include <vector>
int binarySearch(int left, int right, int number, const std::vector<int> &tails, const std::vector<int> &numbers)
{
while (left + 1 < right)
{
int middle = (left + right) / 2;
if (numbers[tails[middle]] > number)
right = middle;
else
left = middle;
}
return right;
}
int main()
{
std::ifstream inFile;
inFile.open("scmax.in");
int n;
inFile >> n;
std::vector<int> numbers(n);
for (int i = 0; i < n; ++i)
{
inFile >> numbers[i];
}
inFile.close();
std::vector<int> tails, previous(n);
tails.push_back(-1);
for (int i = 0; i < n; ++i)
{
if (tails.back() == -1 || numbers[i] > numbers[tails.back()])
{
previous[i] = tails.back();
tails.push_back(i);
continue;
}
int position = binarySearch(0, tails.size(), numbers[i], tails, numbers);
tails[position] = i;
previous[i] = tails[position - 1];
}
std::vector<int> indexPath;
indexPath.push_back(tails.back());
while (previous[indexPath.back()] != -1)
{
indexPath.push_back(previous[indexPath.back()]);
}
std::ofstream outFile;
outFile.open("scmax.out");
outFile << tails.size() - 1 << '\n';
for (int i = indexPath.size() - 1; i >= 0; --i)
{
outFile << numbers[indexPath[i]] << ' ';
}
outFile.close();
return 0;
}