Pagini recente » Cod sursa (job #2267619) | Cod sursa (job #3239573) | Cod sursa (job #134852) | Cod sursa (job #2655074) | Cod sursa (job #2246773)
#include <algorithm>
#include <fstream>
#include <vector>
using IntVector = std::vector<int>;
using Pair = std::pair<int, int>;
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;
IntVector previous;
int n;
fin >> n;
previous.insert(previous.end(), static_cast<unsigned long>(n + 1), 0);
v.push_back(0);
minTable.push_back(Pair{0, 0});
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, i);
else minTable[j + 1] = Pair{x, i};
}
std::ofstream fout("scmax.out");
fout << minTable.size() - 1 << std::endl;
IntVector values;
auto p = minTable[minTable.size() - 1].second;
while(p != 0)
{
values.push_back(v[p]);
p = previous[p];
}
std::reverse(values.begin(), values.end());
for(auto x: values)
fout << x << ' ';
fout << std::endl;
return 0;
}