Pagini recente » Cod sursa (job #1791206) | Cod sursa (job #1709571) | Cod sursa (job #1862353) | Cod sursa (job #3293380) | Cod sursa (job #2246770)
#include <algorithm>
#include <fstream>
#include <vector>
using IntVector = std::vector<int>;
using Pair = std::pair<int, IntVector::iterator>;
using PairVector = std::vector<Pair>;
int binarySearch(const PairVector &v, int x)
{
int step = 1 << 15;
int r = 0;
while(step)
{
if(r + step < v.size() && v[r + step].first < x)
r += step;
step /= 2;
}
return r;
}
int main()
{
std::ifstream fin("scmax.in");
PairVector minTable;
IntVector v;
std::vector<IntVector::iterator> previous;
int n;
fin >> n;
previous.insert(previous.end(), static_cast<unsigned long>(n + 1), IntVector::iterator());
v.push_back(0);
minTable.push_back(Pair{});
for(int i = 1; i <= n; i++)
{
int x;
fin >> x;
v.push_back(x);
auto j = binarySearch(minTable, x);
previous[i] = minTable[j].second;
if(j + 1 == minTable.size())
minTable.emplace_back(x, v.begin() + i);
else minTable[j + 1] = Pair{x, v.begin() + i};
}
std::ofstream fout("scmax.out");
fout << minTable.size() - 1 << std::endl;
IntVector values;
auto p = minTable[minTable.size() - 1].second;
while(p != IntVector::iterator{})
{
values.push_back(*p);
p = previous[std::distance(v.begin(), p)];
}
std::reverse(values.begin(), values.end());
for(auto x: values)
fout << x << ' ';
fout << std::endl;
return 0;
}