Pagini recente » Cod sursa (job #911736) | Cod sursa (job #644838) | Cod sursa (job #2901807) | Cod sursa (job #1505363) | Cod sursa (job #1276886)
#include <fstream>
#include <vector>
#include <algorithm>
#include <limits>
#include <iterator>
using namespace std;
int main()
{
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n;
vector<int> V;
fin >> n;
copy_n(istream_iterator<int>(fin), n, back_inserter(V));
vector<int> DP;
vector<int> seq_tail;
seq_tail.push_back(numeric_limits<int>::min());
for (int i = 0; i < V.size(); ++i)
{
auto it = upper_bound(seq_tail.begin(), seq_tail.end(), V[i]);
int L = (it - 1) - seq_tail.begin() + 1;
if (*(it - 1) != V[i])
{
DP.push_back(L);
if (seq_tail.size() <= L)
seq_tail.push_back(V[i]);
else seq_tail[L] = V[i];
}
else
DP.push_back(L - 1);
}
auto m = max_element(DP.begin(), DP.end());
fout << *m << endl;
int prev = numeric_limits<int>::max();
int pos = *m;
vector<int> result;
for (int i = m - DP.begin(); pos; --i)
{
if (pos == DP[i] && V[i] < prev)
{
result.push_back(V[i]);
--pos;
prev = V[i];
}
}
copy(result.rbegin(), result.rend(), ostream_iterator<int>(fout, " "));
fout << endl;
return 0;
}