Pagini recente » Cod sursa (job #994525) | Cod sursa (job #2020525) | Cod sursa (job #1255980) | Cod sursa (job #3271366) | Cod sursa (job #1404484)
#include <algorithm>
#include <fstream>
#include <map>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
vector<int> v, LIS, parent;
map<int, int> m;
void findLIS()
{
parent.resize(n);
for (size_t i = 0; i < v.size(); ++i)
{
parent[i] = -1;
if (m.find(v[i]) == m.end())
{
map<int, int>::iterator nextElement = m.lower_bound(v[i]);
if (nextElement != m.end())
m.erase(nextElement);
m[v[i]] = i;
map<int, int>::iterator it = m.find(v[i]);
map<int, int>::iterator prevIt = it;
if (it != m.begin())
{
--prevIt;
parent[it -> second] = prevIt -> second;
}
}
}
int p = m.rbegin() -> second;
while (p != -1)
{
LIS.push_back(v[p]);
p = parent[p];
}
reverse(LIS.begin(), LIS.end());
}
int main()
{
fin >> n;
for (int i = 0; i < n; ++i)
{
int x; fin >> x;
v.push_back(x);
}
findLIS();
fout << LIS.size() << '\n';
for (size_t i = 0; i < LIS.size(); ++i)
fout << LIS[i] << ' ';
return 0;
}