Pagini recente » Cod sursa (job #2961691) | Cod sursa (job #2863616) | Cod sursa (job #2190661) | Cod sursa (job #439759) | Cod sursa (job #1131533)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ifstream in("scmax.in");
ofstream out("scmax.out");
vector<int> vec;
vector<int> tops;
vector<vector<int> > stacks, backs;
int n;
in >> n;
int a;
for(int i = 0; i < n; i++)
{
in >> a;
vec.push_back(a);
}
for(int i = 0; i < n; i++)
{
a = vec[i];
vector<int>::iterator it;
it = lower_bound(tops.begin(), tops.end(), a);
if(it == tops.end())
{
tops.push_back(a);
stacks.push_back(vector<int>());
stacks.back().push_back(a);
backs.push_back(vector<int>());
if(backs.size() == 1)
backs.back().push_back(-1);
else
backs.back().push_back(backs[backs.size()-2].size()-1);
}
else
{
int index = it - tops.begin();
tops[index] = a;
stacks[index].push_back(a);
if(index > 0)
backs[index].push_back(backs[index - 1].size() - 1);
else
backs[index].push_back(-1);
}
}
out << stacks.size() << '\n';
vector<int> result;
result.resize(stacks.size());
int idx = stacks.back().size() - 1;
for(int i = stacks.size() - 1; i >= 0; i--)
{
result[i] = stacks[i][idx];
idx = backs[i][idx];
}
for(int i = 0; i < result.size(); i++)
out << result[i] << " ";
return 0;
}